Collectors.reducing提供三种重载形式:无初始值返回Optional,有初始值确保非空结果,带映射支持类型转换;适用于求和、最值及对象属性聚合,需注意结合律与单位元设计以保证并行正确性。

在Java 8引入的Stream API中,Collectors.reducing 是一个强大的归约工具,用于将流中的元素逐步合并为一个结果。它适用于求和、最大值、最小值或自定义聚合逻辑等场景。下面详细说明其用法与实现原理。
Collectors.reducing 提供了三个重载版本,分别适用于不同的使用场景:
假设有一个整数列表,使用 reducing 实现求和:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);<br>Optional<Integer> sum = numbers.stream()<br> .collect(Collectors.reducing(Integer::sum));<br>System.out.println(sum.orElse(0)); // 输出 15
这里没有提供初始值,所以返回的是 Optional 类型。若流为空,则结果为 Optional.empty()。
立即学习“Java免费学习笔记(深入)”;
如果希望避免 Optional 判断,可提供初始值:
int sumWithIdentity = numbers.stream()<br> .collect(Collectors.reducing(0, Integer::sum));<br>System.out.println(sumWithIdentity); // 输出 15
此时即使流为空,结果也是 0,适合用于安全聚合。
当需要对对象的某个属性进行归约时,使用第三个版本最为合适。例如统计商品总价:
class Product {<br> private String name;<br> private double price;<br> // 构造函数、getter省略<br>}
List<Product> products = Arrays.asList(<br> new Product("A", 100),<br> new Product("B", 200),<br> new Product("C", 300)<br>);
double total = products.stream()<br> .collect(Collectors.reducing(0.0, Product::getPrice, Double::sum));<br>System.out.println(total); // 输出 600.0
这里将每个 Product 映射为 price,然后以 0.0 为初始值进行累加。
reducing 的核心是通过 BinaryOperator 定义合并规则,其执行过程如下:
需要注意:
基本上就这些。Collectors.reducing 灵活但需注意类型与初始值设计,合理使用可简化复杂聚合逻辑。
以上就是Java里如何使用Collectors.reducing实现归约操作_流归约方法与实现解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号