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
配合 Optional 处理空流更安全
空流时 getMin()/getMax() 的默认值容易引发逻辑误判。建议先判断是否非空,或用 Optional 包装原始数据再收集。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 不推荐直接对空集合调用
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等单一收集器反而更轻量

















