使用Collectors.groupingBy()与Collectors.summarizingInt()组合可按字段分组并计算整数字段的计数、总和、最小值、最大值、平均值;例如按category分组统计price,返回Map,支持getCount()、getSum()、getMin()、getMax()、getAverage()获取具体值。

用 Collectors.groupingBy() 和 Collectors.summarizingInt() 组合,可以一次性按某个字段分组,并为每组计算整数型字段的统计摘要(包括计数、总和、最小值、最大值、平均值)。
基础用法:按分类分组并统计数量字段
假设你有一组商品数据,想按品类(category)分组,统计每个品类下商品价格(price)的汇总信息:
Map<String, IntSummaryStatistics> categoryPriceStats = products.stream()
.collect(Collectors.groupingBy(
Product::getCategory,
Collectors.summarizingInt(Product::getPrice)
));
结果是一个 Map<string intsummarystatistics></string>,例如:
获取具体统计值:从 IntSummaryStatistics 中提取结果
每个分组对应的 IntSummaryStatistics 对象提供了便捷方法读取统计结果:
-
count:该组元素个数 →
stats.getCount() -
sum:该组整数字段总和 →
stats.getSum() -
min:该组最小值(若为空则返回
Integer.MAX_VALUE)→stats.getMin() -
max:该组最大值(若为空则返回
Integer.MIN_VALUE)→stats.getMax() -
average:该组平均值(
double类型)→stats.getAverage()
处理空组或避免空指针:加个 toList() 做兜底(可选)
如果某组可能没有元素(比如某些分类在流中根本没出现),summarizingInt 仍会生成一个空的 IntSummaryStatistics(count=0,min/max 为边界值,average=0.0)。如需更安全地判断是否为空,可先用 toList() 再手动计算,但通常直接使用 summarizingInt 已足够健壮。
扩展:配合 filtering 或 mapping 进行条件统计
如果只想统计满足条件的商品(比如只统计价格 > 1000 的商品),可用 filtering + summarizingInt:
Map<String, IntSummaryStatistics> highPriceStats = products.stream()
.collect(Collectors.groupingBy(
Product::getCategory,
Collectors.filtering(p -> p.getPrice() > 1000,
Collectors.summarizingInt(Product::getPrice))
));
注意:此时空组的 IntSummaryStatistics 的 count 为 0,其余值也按空统计逻辑给出。

















