java包装类本身不提供sum方法,但long、integer等提供了静态sum方法(如long.sum),可作为stream.reduce()的累加器,语义明确且避免装箱开销;推荐用stream.reduce(0l, long::sum)或maptolong().sum(),后者性能更优。

Java 中包装类本身不直接提供 sum 这类静态方法,但 Long、Integer 等包装类的对应基本类型包装器(如 Long)确实提供了像 Long.sum(long a, long b) 这样的静态方法,它们常被用作 Stream.reduce() 的累加器函数,实现自定义归纳操作。
为什么用 Long.sum 而不是 + 运算符?
Long.sum(a, b) 本质就是 a + b,但它是一个符合 BinaryOperator<long></long> 接口签名的静态方法引用,可直接传递给 reduce。相比手动写 lambda(如 (x, y) -> x + y),它更简洁、语义明确,且避免了自动拆箱/装箱的冗余表达。
-
Long.sum接收两个long参数,返回long,而 Stream 中若元素是Long,则需确保 reduce 的泛型类型一致 - 它不处理溢出(和
+一样),如需安全加法,应改用Math.addExact - 不能直接用于
Stream<long></long>的mapToLong().sum()——那是终端操作,无需手动 reduce
在 Stream.reduce() 中正确使用 Long.sum
对 Stream<long></long> 做归纳求和时,需注意初始值类型和方法引用匹配:
- 若流为空,
reduce(Long::sum)返回Optional<long></long>,需用orElse(0L)等处理 - 推荐写法:
stream.reduce(0L, Long::sum)—— 提供初始值0L,返回Long,避免 Optional 拆包 - 错误示例:
stream.reduce(Long::sum)配合Integer初始值会编译失败,因类型不匹配
其他包装类类似用法(Integer、Double)
同理,Integer.sum、Double.sum 也支持相同模式:
Stream<integer>.reduce(0, Integer::sum)</integer>Stream<double>.reduce(0.0, Double::sum)</double>- 注意:
Boolean和Character没有对应的sum方法,不可用 - 这些方法本质是函数式接口适配器,不是“包装类特有功能”,而是 JDK 为常用运算提供的工具方法
对比 mapToXxx().sum() 更推荐哪种?
对于简单求和,优先用原始类型流的终端操作:
-
stream.mapToLong(Long::longValue).sum()—— 性能更好,无装箱开销 -
stream.reduce(0L, Long::sum)—— 语义清晰,适合链式复杂逻辑或需自定义结合律的场景 - 若流中可能含
null,mapToLong会抛 NPE,而reduce可前置过滤,更可控
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











