Collectors.summingInt 是 Java Stream API 中用于对流中元素的 int 类型属性求和的收集器,返回 int 值,空流结果为 0,不支持 null 元素,需注意溢出与空值处理。

Collectors.summingInt 是 Java Stream API 中用于对流中元素的某个 int 类型属性 进行累加求和的收集器,它返回一个 int 值,而不是 Optional 或其他容器。
核心用法:传入属性提取函数
它接收一个 ToIntFunction<t></t> 函数,即从每个对象中提取一个 int 值(比如 getter 方法引用)。Stream 会自动遍历所有元素,调用该函数获取每个元素对应的 int 值,然后累加求和。
- 如果流为空,结果为
0(不是 null,也不是异常) - 不支持 null 元素 —— 若某个对象为 null,调用其 getter 时会抛出
NullPointerException - 仅适用于
int类型字段;若属性是Integer包装类,需用Objects.requireNonNull(obj.getField(), "field")或先判空,否则可能 NPE
常见写法示例
假设有学生类:
class Student { private String name; private int score; /* 构造、getter 略 */ }计算所有学生成绩总和:
立即学习“Java免费学习笔记(深入)”;
int total = students.stream().collect(Collectors.summingInt(Student::getScore));- 等价于手动写循环:
int sum = 0; for (Student s : students) sum += s.getScore(); - 也可用 lambda:
.collect(Collectors.summingInt(s -> s.getScore())),但方法引用更简洁安全
注意边界情况
summingInt 不做空值保护,也不处理溢出:
- 若数据量大且数值极大,可能发生
int溢出(正负21亿范围内),此时应改用summingLong+long属性,或用reduce(0L, (acc, s) -> acc + s.getScore(), Long::sum) - 若集合含 null 元素,建议提前过滤:
stream.filter(Objects::nonNull).collect(...) - 若属性本身可能为 null(如 Integer score),应先映射为基本类型或默认值:
.mapToInt(s -> s.getScore() != null ? s.getScore() : 0),再 collect 或直接用 mapToInt
替代方案对比
比起 summingInt,有时更灵活的方式是:
-
mapToInt(Student::getScore).sum()—— 更直观,语义清晰,性能略优(少一层 collector 封装) -
reduce(0, (a, s) -> a + s.getScore(), Integer::sum)—— 支持并行流自定义合并逻辑,但通常没必要 - 需要同时统计多个指标(如总分+人数+平均分)时,更适合用
summarizingInt


















