Collectors.summingInt()用于对流中元素的int字段或表达式求和,返回Collector配合collect()使用;支持方法引用、lambda表达式,空流返回0,但映射函数需避免null。

用 Collectors.summingInt() 可以方便地对流中元素的某个 int 类型字段或表达式求和,它返回一个 Collector,配合 Stream.collect() 使用。
基本用法:对对象的 int 字段求和
假设有一个学生类,需要按年龄求和:
class Student {
String name;
int age;
Student(String name, int age) {
this.name = name;
this.age = age;
}
}
创建学生列表并求总年龄:
List<student> students = Arrays.asList(
new Student("张三", 20),
new Student("李四", 22),
new Student("王五", 19)
);
int totalAge = students.stream()
.collect(Collectors.summingInt(Student::age)); // → 61</student>
支持任意 int 表达式,不局限于 getter
你可以传入任何返回 int 的 lambda 表达式,比如字符串长度、计算值等:
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
- 计算所有名字长度之和:
int totalNameLength = students.stream()
.collect(Collectors.summingInt(s -> s.name.length())); // "张三"(2)+"李四"(2)+"王五"(2) = 6
- 对整数列表自身求和(直接用 identity):
List<integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.collect(Collectors.summingInt(Integer::intValue)); // → 10</integer>
注意空流和 null 值的处理
summingInt 对空流返回 0,安全无需额外判空:
List<student> empty = Collections.emptyList(); int result = empty.stream().collect(Collectors.summingInt(Student::age)); // → 0</student>
但若映射函数返回 null(如调用可能为 null 的对象方法),会抛 NullPointerException。确保映射逻辑不产生 null:
- 避免写
s -> s.getAge()而getAge()返回Integer(包装类型) - 应转为
s -> Objects.requireNonNullElse(s.getAge(), 0)或改用summingLong+ 显式转换
替代方案对比:sum() vs summingInt()
Stream.of(1,2,3).mapToInt(x -> x).sum() 也能求和,区别在于:
-
summingInt是Collector,适合在复杂收集场景中与其他操作组合(如分组后求和) -
mapToInt(...).sum()是终端操作,更轻量,纯求和时推荐用它 - 分组求和必须用
summingInt:
Map<string integer> sumByGrade = students.stream()
.collect(Collectors.groupingBy(
s -> "A",
Collectors.summingInt(Student::age)
));</string>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










