Java Stream API详解
一、核心概念
Stream API是从Java 8引入的一个强大工具,用于处理集合数据。它提供了一种声明式的方式来操作集合,支持链式调用和并行处理。
关键概念:
Stream
(流):代表一个数据序列,支持聚合操作- 中间操作(
Intermediate Operations
):返回一个新的流,可以链式调用(如filter
,map
,sorted
) - 终端操作(
Terminal Operations
):触发流的处理并返回结果(如forEach
,collect
,reduce
)
二、创建Stream的方式
// 1. 从集合创建
List<String> list = Arrays.asList("Java", "Python", "C++");
Stream<String> stream1 = list.stream();// 2. 从数组创建
String[] array = {"Java", "Python", "C++"};
Stream<String> stream2 = Arrays.stream(array);// 3. 使用Stream.of()创建
Stream<String> stream3 = Stream.of("Java", "Python", "C++");// 4. 创建无限流
Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 1);
三、常用中间操作
List<String> languages = Arrays.asList("Java", "Python", "C++", "JavaScript");// filter: 过滤元素
List<String> filter = languages.stream().filter(s -> s.startsWith("J")).collect(Collectors.toList());// map: 转换元素
List<Integer> lengths = languages.stream().map(String::length).collect(Collectors.toList());// sorted: 排序
List<String> sorted = languages.stream().sorted().collect(Collectors.toList());// distinct: 去重
List<String> distinct = languages.stream().distinct().collect(Collectors.toList());
四、常用终端操作
List<String> languages = Arrays.asList("Java", "Python", "C++", "JavaScript");// forEach: 遍历
languages.stream().forEach(System.out::println);// collect: 收集结果
List<String> filtered = languages.stream().filter(s -> s.length() > 4).collect(Collectors.toList());// reduce: 归约
Optional<String> concatenated = languages.stream().reduce((s1, s2) -> s1 + "," + s2);// count: 计数
long count = languages.stream().filter(s -> s.startsWith("J")).count();// findFirst: 查找第一个
Optional<String> first = languages.stream().filter(s -> s.startsWith("P")).findFirst();
五、Stream的优势
- 声明式编程:更关注“做什么”而不是“怎么做”
- 链式调用:操作可以串联,代码更流畅
- 函数式编程:支持
lambda
表达式,代码更简洁 - 惰性求值:中间操作不会立即执行,提高效率
- 并行处理:容易实现并行计算
六、注意事项
- 流不可复用:终端操作执行后,流对象失效
- 性能考虑:对于简单遍历,传统
for
循环可能更高效 - 调试困难:
Stream
链式操作调试相对困难 - 可读性:过于复杂的
Stream
操作可能降低可读性
Stream API是Java 8的一个重要特性,它提供了一种高效且易于使用的方式来处理集合数据,特别适用于复杂的数据处理场景。