代码对比
✕ Java 8
long count = items.stream().count();
double sum = items.stream()
.mapToDouble(Item::price)
.sum();
var result = new Stats(count, sum);
✓ Java 12+
var result = items.stream().collect(
Collectors.teeing(
Collectors.counting(),
Collectors.summingDouble(Item::price),
Stats::new
)
);
发现此代码有问题? 告诉我们。
为什么现代方式更好
单次遍历
只处理流一次,而非两次。
无可变状态
无需用于收集中间结果的临时变量。
可组合
可与其他收集器组合作为下游收集器。
旧方式
两次遍历
现代方式
teeing()
自 JDK
12
难度
中级
JDK 支持
Collectors.teeing()
可用
自 JDK 12 起广泛可用(2019 年 3 月)
工作原理
Collectors.teeing() 将每个元素发送到两个下游收集器,然后将结果合并。不再需要对流进行两次遍历或将中间结果存储在可变变量中。
相关文档