Java中Stream的reduce求和需根据场景选择:非空流用reduce(0, Integer::sum)返回int;空流可能时用reduce(Integer::sum)返回Optional再orElse(0);Long/Double类型须匹配初始值和方法引用;日常求和优先用mapToInt().sum()等专用方法。

Java中用Stream的reduce做数字累加求和,核心是传入一个初始值(如0)和一个二元累加操作(如a + b),它会把流中所有元素按顺序“折叠”成一个结果。
基础写法:用 reduce(int identity, BinaryOperator<Integer>)
适用于int类型集合,最直观也最常用:
- 第一个参数是初始值,比如求和就填0
- 第二个参数是累加规则,通常用lambda表达式 (a, b) -> a + b,或方法引用 Integer::sum
- 注意:这个重载返回的是基本类型int,不会为null,适合确定非空流
示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream().reduce(0, (a, b) -> a + b); // 结果:15 // 或简写为 int sum2 = numbers.stream().reduce(0, Integer::sum);
处理可能为空的流:用 reduce(Optional<T>)
当流可能为空时,推荐用无初始值的reduce(),返回Optional,避免默认值干扰语义:
立即学习“Java免费学习笔记(深入)”;
- 调用stream.reduce((a, b) -> a + b),返回Optional
- 后续用orElse(0)、orElseThrow()等安全取值
- 特别适合从数据库查询可能为空的列表、过滤后结果不确定的场景
示例:
List<Integer> empty = Collections.emptyList(); Optional<Integer> result = empty.stream().reduce(Integer::sum); int sum = result.orElse(0); // 空流时返回0
泛型数字类型(如Long、Double)要匹配类型
Stream
- LongStream有专用sum()方法,更高效(如list.stream().mapToLong(x -> x).sum())
- 若坚持用reduce,确保类型一致:Long流用0L作初始值,用Long::sum
- Double同理,用0.0作为identity,用Double::sum
示例:
List<Long> longs = Arrays.asList(1L, 2L, 3L); long sumLong = longs.stream().reduce(0L, Long::sum);
注意点:reduce不是万能求和工具
虽然功能强大,但日常求和优先考虑更简洁、更明确的替代方案:
- 整数流直接用stream.mapToInt(x -> x).sum(),性能更好且语义清晰
- LongStream/DoubleStream自带sum()方法,无需手写reduce
- reduce适合需要自定义聚合逻辑(如加权求和、字符串拼接),单纯求和反而显得冗余
不复杂但容易忽略。


















