在 Java 8 及以上版本中,stream
提供了一种更简洁、高效、可读性更强的方式来处理集合数据,比如遍历、筛选、映射、归约(reduce)、聚合等操作。相比传统的 for 循环或迭代器,stream
具备以下优势:
1. 代码简洁,提高可读性
传统方式(for 循环):
List numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (int num : numbers) {
sum += num;
}
System.out.println(sum); // 15
Stream 方式(更简洁):
int sum = numbers.stream().reduce(0, Integer::sum);
System.out.println(sum); // 15
不需要显式定义变量、遍历集合,代码更加清晰!
如果你需要对数据进行多个操作(如过滤、转换、计算),传统写法可能会嵌套多层循环,而 stream
支持链式操作,使代码更直观。
传统方式:
int sum = 0;
for (int num : numbers) {
if (num > 2) {
sum += num * num;
}
}
System.out.println(sum); // 54
Stream 方式(链式操作):
int sum = numbers.stream()
.filter(n -> n > 2) // 过滤大于 2 的数
.map(n -> n * n) // 求平方
.reduce(0, Integer::sum); // 求和
System.out.println(sum); // 54
stream
支持并行流,可以自动利用多核 CPU 进行并行计算,提高性能。
int sum = numbers.parallelStream().reduce(0, Integer::sum);
parallelStream()
能自动分配多个线程执行运算,适合大数据集合的计算。
⚠ 注意:
parallelStream()
适用于计算密集型任务,但对小数据集可能会带来额外的线程开销,导致性能下降。
我们有一个 User
列表,想按照年龄分组:
class User {
String name;
int age;
public User(String name, int age) { this.name = name; this.age = age; }
}
List users = Arrays.asList(new User("Alice", 25), new User("Bob", 30), new User("Charlie", 25));
Map> groupedByAge = users.stream().collect(Collectors.groupingBy(user -> user.age));
System.out.println(groupedByAge);
传统方式需要嵌套 for 循环,stream
让分组变得更简单!
stream
采用 惰性计算(lazy evaluation),只有在最终需要结果时,才会执行计算,避免不必要的中间操作,提高效率。
List result = numbers.stream()
.filter(n -> {
System.out.println("过滤:" + n);
return n > 2;
})
.map(n -> {
System.out.println("映射:" + n);
return n * n;
})
.collect(Collectors.toList());
System.out.println(result);
如果没有 .collect()
,过滤和映射不会执行!
传统循环容易因索引越界、变量未初始化等问题导致 NullPointerException
,而 stream
通过 Optional 机制更安全:
Optional max = numbers.stream().max(Integer::compareTo);
max.ifPresent(System.out::println); // 5
优点 | 描述 |
---|---|
代码简洁 | 避免繁琐的 for 循环,提高可读性 |
支持链式操作 | 让代码逻辑更清晰,如 filter 、map 、reduce 组合 |
可并行计算 | 通过 parallelStream() 自动利用多核 CPU,提高性能 |
适用于复杂数据处理 | 适合数据转换、分组、排序等操作 |
惰性计算 | 只有需要结果时才执行,避免不必要计算,提高效率 |
更安全 | 使用 Optional 避免 NullPointerException |