java中计算集合总和推荐用stream.maptoint().sum()或collectors.summingint(),空集合安全返回0;乘积需用reduce(1, (a,b)->a*b),注意溢出与null处理。

Java 中计算集合中元素的总和与乘积,主要取决于集合类型(如 List、Set)和元素类型(如 Integer、Double、Long),推荐使用 Stream API(JDK 8+)简洁高效地完成;若需处理空集合、大数溢出或自定义类型,需额外注意边界情况。
使用 Stream 计算数值型集合的总和
对 Collection extends Number>(如 List<integer></integer>),可调用 stream().mapToInt().sum() 等方法:
-
整数集合:用
mapToInt(Integer::intValue).sum(),返回int;若可能溢出,改用mapToLong(Integer::longValue).sum() -
浮点集合:用
mapToDouble(Double::doubleValue).sum(),注意浮点精度误差 -
空集合:
sum()默认返回 0,无需判空;但若需区分“无数据”和“和为 0”,应先检查isEmpty()
使用 Stream 计算乘积(需手动 reduce)
Stream 没有内置乘积方法,但可用 reduce() 实现:
- 基础写法:
list.stream().reduce(1, (a, b) -> a * b),初始值为 1,适用于Integer或Long - 防空集合:
reduce返回Optional,建议用reduce(1L, Math::multiplyExact)配合Long类型,并捕获ArithmeticException处理溢出 - 泛型适配:对
Double用reduce(1.0, (a, b) -> a * b);注意NaN和无穷大会传播
处理非基本类型或自定义对象
若集合元素是自定义类(如 Product 含 price 字段),需先提取数值再聚合:
- 求和:
list.stream().mapToDouble(p -> p.getPrice()).sum() - 乘积:
list.stream().mapToDouble(p -> p.getPrice()).reduce(1.0, (a, b) -> a * b) - 避免装箱开销:优先用
mapToDouble/mapToInt而非map+reduce,减少对象创建
兼容旧版本或特殊场景的替代方案
若项目仍在用 JDK 7 或需极致性能,可回退到传统循环:
- 手动遍历求和:
int sum = 0; for (Integer i : list) sum += i;(注意 int 溢出) - 手动遍历求积:
long product = 1; for (Integer i : list) product *= i.longValue(); - 第三方库:Apache Commons Collections 提供
CollectionUtils.sum()(仅限Number子类),但功能有限且已不推荐新项目使用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











