Collectors.summarizingInt是Java 8中用于流式整数统计的收集器,一键返回含计数、总和、最值及平均值的IntSummaryStatistics对象;空流时getMin()/getMax()返回极值,getAverage()为0.0,需结合getCount()判断有效性。

Collectors.summarizingInt 是 Java 8 Stream API 中一个便捷的收集器,用于对 int 类型数据快速生成包含计数、总和、最小值、最大值和平均值的统计摘要(IntSummaryStatistics)。它特别适合在不需手动遍历或多次调用 mapToInt 的情况下,一次性获取完整数值统计信息。
基本用法:一步获取完整整数统计
只需将流映射为 int 值,再使用 Collectors.summarizingInt 收集即可:
- 适用于
Stream,需配合mapToInt提取整型字段(如对象的age、score) - 返回
IntSummaryStatistics实例,提供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", 22)
);
IntSummaryStatistics stats = people.stream()
.mapToInt(Person::getAge)
.collect(Collectors.summarizingInt(i -> i));
System.out.println("count: " + stats.getCount()); // 3
System.out.println("sum: " + stats.getSum()); // 77
System.out.println("min: " + stats.getMin()); // 22
System.out.println("max: " + stats.getMax()); // 30
System.out.println("average: " + stats.getAverage()); // 25.666...
</person>
处理空流与边界情况
该收集器对空流有明确定义行为,但需注意实际业务含义:
- 空流时
getCount() == 0,此时getAverage()为0.0—— 若需区分“无数据”和“平均值为 0”,应先检查getCount() > 0 -
getMin()和getMax()在空流下返回极值常量,直接使用可能引发逻辑错误,建议结合计数判断有效性 - 不支持
null元素;若源数据含null,应在mapToInt前过滤(如filter(Objects::nonNull))
替代方案对比:何时不用 summarizingInt
虽然简洁,但它仅限 int,且返回的是只读统计对象。以下情况可考虑其他方式:
- 需要
long或double统计 → 改用summarizingLong或summarizingDouble - 需同时计算百分位数、标准差等高级指标 → 需借助第三方库(如 Apache Commons Math)或手动累积
- 只需其中某一项(如仅求和)→ 直接用
mapToInt(...).sum()更高效,避免构造完整统计对象
与自定义收集器的协同使用
若需在统计基础上扩展(如记录中位数、众数),可将 summarizingInt 作为子步骤嵌入自定义收集器,或先获取 IntSummaryStatistics,再基于其 getCount() 和 getSum() 等字段进一步计算。
例如:判断平均值是否超过阈值,并附带人数提示:
String report = people.stream()
.mapToInt(Person::getAge)
.collect(Collectors.summarizingInt(i -> i))
.let(stats -> String.format(
"共 %d 人,年龄均值 %.1f,%s达标",
stats.getCount(),
stats.getAverage(),
stats.getAverage() >= 25 ? "已" : "未"
));










