java中reduce方法通过二元操作函数归约流元素,支持带初始值(返回确定值)和无初始值(返回optional)两种用法,需注意类型匹配、性能优化及并行流下结合律要求。

Java 中 reduce 方法对流中元素进行归约求和,核心是提供一个**二元操作函数(BinaryOperator)**,将两个元素合并为一个结果,并持续累积,直到只剩一个值。
基础用法:带初始值的 reduce
最稳妥的方式是传入初始值(identity),避免空流抛异常:
-
语法:
stream.reduce(identity, (a, b) -> a + b)或使用方法引用Integer::sum - 说明:初始值参与第一次计算;即使流为空,也返回该初始值
-
示例:
List<integer> nums = Arrays.asList(1, 2, 3, 4);<br>int sum = nums.stream().reduce(0, Integer::sum); // 结果为 10</integer>
无初始值的 reduce(需谨慎)
适用于非空流,返回 Optional:
-
语法:
stream.reduce((a, b) -> a + b) -
说明:若流为空,返回
Optional.empty();调用get()前应判空 -
示例:
Optional<integer> optSum = nums.stream().reduce(Integer::sum);<br>int result = optSum.orElse(0); // 安全获取,默认为 0</integer>
注意类型匹配与泛型推导
归约结果类型不一定和元素类型相同,尤其涉及装箱/拆箱或数值提升时:
- 整数流推荐用
mapToInt().sum()更高效(避免装箱):nums.stream().mapToInt(Integer::intValue).sum() - 若元素是
Long或混合类型,显式指定泛型或转换类型,防止编译错误或溢出 -
关键点:
reduce是通用归约,不专为求和设计;而sum()、max()等是特化终端操作,语义更清晰、性能更好
并行流中的 reduce(满足结合律即可)
只要累加操作满足结合律(如 +、Math.max),reduce 在并行流中也能正确工作:
-
示例:
nums.parallelStream().reduce(0, Integer::sum)是线程安全且等价的 - 提醒:不要在 lambda 中修改外部变量或依赖顺序——归约本身不保证执行顺序
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











