引言
Java 8 引入的 Stream API 彻底改变了集合操作方式,通过声明式编程简化数据处理,提升代码可读性和性能。本文将分享实用技巧,助你高效驾驭 Stream。
1. 惰性计算:提升性能的关键
Stream 的中间操作(如 filter
、map
)是惰性的,只有终端操作(如 collect
)触发时才会执行:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> result = names.stream()
.filter(name -> {
System.out.println("Filtering: " + name); // 仅终端操作时执行
return name.length() > 3;
})
.collect(Collectors.toList()); // 触发计算
2. 短路操作:优化处理流程
利用 limit()
、findFirst()
提前终止流,避免全量处理:
Optional<String> longName = names.stream()
.filter(name -> name.length() > 10)
.findFirst(); // 找到第一个即停止
3. 并行流:简单实现多线程处理
添加 .parallel()
一键并行化(注意线程安全):
List<String> upperCaseNames = names.parallelStream()
.map(String::toUpperCase)
.collect(Collectors.toList());
4. 避免副作用:保持函数式纯度
Stream 操作应无状态,避免修改外部变量:
// 错误示范:操作中修改外部列表
List<String> output = new ArrayList<>();
names.stream().forEach(name -> output.add(name));
// 正确做法:使用 collect
List<String> output = names.stream().collect(Collectors.toList());
5. 高效数值流:避免装箱开销
处理原始类型时,使用 IntStream
、LongStream
提升性能:
int sum = IntStream.rangeClosed(1, 100) // 避免 Integer 装箱
.reduce(0, Integer::sum);
结语
Stream API 通过链式调用和惰性计算,让集合操作更简洁高效。牢记:
- 优先使用无状态中间操作
- 并行流适用于大数据量且无共享状态的场景
- 避免在流中修改外部数据