collectors.summingint 是 java stream api 中用于对流中元素的 int 类型属性求和的收集器,返回 collector 供 collect() 使用,可替代手动累加;例如对整数列表求和得 15。

Collectors.summingInt 是 Java Stream API 中用于对流中元素的某个 int 类型属性求和的收集器,它返回一个 Collector,配合 collect() 方法使用,适合替代手动遍历累加。
基本用法:对简单整数流求和
如果流中直接是 Integer 或 int 类型,可传入恒等函数(Integer::intValue 或 i -> i):
List<integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream().collect(Collectors.summingInt(Integer::intValue)); // 结果:15 </integer>
注意:summingInt 接收的是 ToIntFunction super T>,即从元素映射为 int 的函数。
对对象列表按字段求和
常见场景是统计对象中某个 int 字段(如商品价格、用户年龄)的总和:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
class Product {
private String name;
private int price;
// 构造器、getter 略
}
List<product> products = Arrays.asList(
new Product("A", 10),
new Product("B", 20),
new Product("C", 15)
);
int total = products.stream().collect(Collectors.summingInt(Product::getPrice));
// 结果:45
</product>
- 确保 getter 返回
int(不是Integer包装类,否则需用summingLong或.orElse(0)处理 null) - 若字段为
Integer且可能为null,建议先filter(Objects::nonNull)或改用mapToInt(p -> p.getPrice() != null ? p.getPrice() : 0)
与其它收集器组合使用的注意事项
summingInt 本身只返回 int,不支持链式分组或分区。如需按条件分组再求和,应搭配 Collectors.groupingBy:
// 按类别分组并计算各组价格总和
Map<string integer> categorySum = products.stream()
.collect(Collectors.groupingBy(
Product::getCategory,
Collectors.summingInt(Product::getPrice)
));
</string>
此时内层必须用 summingInt,外层用 groupingBy 控制分组逻辑。
空流或 null 元素的处理
summingInt 对空流返回 0,安全;但若映射函数返回 null(例如调用 null 对象的 getter),会抛 NullPointerException:
- 推荐提前过滤掉 null 元素:
stream().filter(Objects::nonNull) - 或在映射时提供默认值:
p -> p == null ? 0 : p.getPrice() - 避免依赖自动拆箱 ——
Integer字段为null时直接调用intValue()也会 NPE
不复杂但容易忽略细节,关键是把“映射到 int”这一步写清楚、防 null、匹配字段类型。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










