Java Stream API 完全指南:集合操作的艺术
Stream API 是 Java 8 引入的函数式编程特性,让集合操作更简洁。
创建 Stream
// 从集合创建
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
// 从数组创建
String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
// 直接创建
Stream<String> stream = Stream.of("a", "b", "c");
// 生成
Stream<Integer> stream = Stream.iterate(0, n -> n + 1).limit(10);
中间操作
filter
// 过滤
list.stream()
.filter(s -> s.startsWith("a"))
.collect(Collectors.toList());
map
// 转换
list.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
sorted
// 排序
list.stream()
.sorted()
.collect(Collectors.toList());
distinct
// 去重
list.stream()
.distinct()
.collect(Collectors.toList());
limit/skip
// 分页
list.stream()
.skip(10)
.limit(5)
.collect(Collectors.toList());
终端操作
collect
// 转为 List
List<String> list = stream.collect(Collectors.toList());
// 转为 Set
Set<String> set = stream.collect(Collectors.toSet());
// 转为 Map
Map<String, Integer> map = stream.collect(
Collectors.toMap(User::getName, User::getAge)
);
reduce
// 求和
int sum = numbers.stream()
.reduce(0, Integer::sum);
// 最大值
int max = numbers.stream()
.reduce(Integer::max)
.orElse(0);
forEach
// 遍历
list.stream()
.forEach(System.out::println);
实用示例
分组
Map<Integer, List<User>> groupByAge = users.stream()
.collect(Collectors.groupingBy(User::getAge));
统计
IntSummaryStatistics stats = users.stream()
.mapToInt(User::getAge)
.summaryStatistics();
stats.getAverage(); // 平均值
stats.getMax(); // 最大值
stats.getMin(); // 最小值
stats.getSum(); // 总和
stats.getCount(); // 数量
过滤 + 转换
List<String> names = users.stream()
.filter(u -> u.getAge() > 18)
.map(User::getName)
.sorted()
.collect(Collectors.toList());
并行流
// 并行处理
list.parallelStream()
.filter(s -> s.startsWith("a"))
.collect(Collectors.toList());
注意: 并行流使用 ForkJoinPool,不适合 IO 操作。
最佳实践
- 优先使用 Stream:比 for 循环更简洁
- 避免副作用:不要在 Stream 中修改外部变量
- 合理使用并行流:大数据量、CPU 密集型任务
- 使用方法引用:比 Lambda 更简洁
总结
Stream API 让集合操作更简洁、更函数式。掌握 Stream,可以写出更优雅的 Java 代码。