collectors.summarizingint 一行代码获取整数流的计数、总和、最小值、最大值和平均值,返回封装五项统计的 intsummarystatistics 对象;空流时 getmin() 返回 integer.max_value、getmax() 返回 integer.min_value、getaverage() 返回 0.0,建议配合 optional 或 getcount() 判断空流;类似方法还有 summarizinglong 和 summarizingdouble,但不支持中位数等复杂指标。

用 Collectors.summarizingInt 可以一行代码拿到整数流的计数、总和、最小值、最大值和平均值,不用自己手动遍历计算。
直接获取 IntSummaryStatistics 对象
它返回的是 IntSummaryStatistics 实例,封装了五个常用统计值。适合需要多个指标、又不想多次遍历流的场景。
- 调用方式简单:直接传入一个
ToIntFunction提取整数字段 - 结果对象提供
getCount()、getSum()、getMin()、getMax()、getAverage()方法 - 如果流为空,
getMin()和getMax()返回Integer.MAX_VALUE和Integer.MIN_VALUE,getAverage()返回0.0
示例:
List<person> people = Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 35)
);
IntSummaryStatistics stats = people.stream()
.collect(Collectors.summarizingInt(Person::getAge));
System.out.println(stats.getCount()); // 3
System.out.println(stats.getSum()); // 90
System.out.println(stats.getMin()); // 25
System.out.println(stats.getMax()); // 35
System.out.println(stats.getAverage()); // 30.0
</person>
配合 Optional 处理空流更安全
空流时 getMin()/getMax() 的默认值容易引发逻辑误判。建议先判断是否非空,或用 Optional 包装原始数据再收集。
- 不推荐直接对空集合调用
summarizingInt后无条件取getMin() - 可先用
stream.findFirst().isPresent()判断,或改用Collectors.collectingAndThen做后处理 - 若业务要求“空时返回 null”,可封装一层工具方法,内部检查
stats.getCount() == 0
和其他 summarizingXXX 方法保持一致
Java 还提供了 summarizingLong 和 summarizingDouble,用法完全相同,只是泛型类型和返回的 SummaryStatistics 子类不同。
- 选哪个取决于你提取的字段类型:
int用summarizingInt,long用summarizingLong - 它们都返回对应的 SummaryStatistics(如
LongSummaryStatistics),API 设计统一 - 注意
double版本的getAverage()返回double,且对NaN和无穷值有明确定义
不是万能的:不适合复杂聚合或自定义指标
它只覆盖基础五项统计。如果有中位数、标准差、分位数等需求,就得换方案。
- 可先转成数组/列表,再用 Apache Commons Math 或 EJML 等库计算
- 也可用
Collectors.collectingAndThen+ 自定义收集器组合逻辑 - 单纯求和、计数、极值的话,用
summingInt、counting、maxBy等单一收集器反而更轻量
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











