Java Stream API数值统计:SummaryStatistics应用
SummaryStatistics统计计数、总和、最小、最大值及平均值,支持int、double、long,可结合groupingBy分组汇总。需注意空流默认值及异常值过滤,适用于报表生成、监控指标汇总等数值统计场景。
Ja va Stream API 里的 SummaryStatistics,绝对是数值统计场景下最省心的工具——它不会只给你一个值,而是一次性打包返回计数、总和、最小值、最大值和平均值。报表生成、监控指标汇总、数据探查,这几个场景里它几乎是标配。

先看最常用也最典型的 IntSummaryStatistics。处理 int 类型时,它轻量、线程安全(可以调用 accept() 和 combine() 动态累加),所有字段直接可用:
getCount():元素个数(long类型)getSum():总和(int)getMin()/getMax():极值(空流时默认是Integer.MAX_VALUE/Integer.MIN_VALUE,边界情况要留意)getA verage():自动计算的平均值(double,空流返回0.0)
用法很简单:先用 mapToInt() 转成数值流,再调用 summaryStatistics():
Listscores = Arrays.asList(85, 92, 78, 96, 88); IntSummaryStatistics stats = scores.stream() .mapToInt(Integer::intValue) .summaryStatistics(); System.out.println("共 " + stats.getCount() + " 人,最高 " + stats.getMax() + ",最低 " + stats.getMin() + ",平均 " + String.format("%.2f", stats.getA verage())); // 输出:共 5 人,最高 96,最低 78,平均 87.80
DoubleSummaryStatistics 和 LongSummaryStatistics 同理
对应 double 和 long 类型,API 完全一致,只是返回值类型匹配:
DoubleSummaryStatistics:适用于浮点运算、带小数的指标(比如响应时间、评分)LongSummaryStatistics:适合大整数统计,比如用户ID计数、金额累计(避免int溢出)
不过要注意:DoubleSummaryStatistics 中 getMin()/getMax() 对 NaN 和无穷值有特殊处理逻辑,实际使用中最好提前过滤掉异常值。
结合 groupingBy 实现分组汇总
如果想像按类别分别看统计?把 SummaryStatistics 当作聚合器,传给 Collectors.collectingAndThen 或直接嵌套在 groupingBy 里:
MapregionStats = users.stream() .collect(Collectors.groupingBy( User::getRegion, Collectors.summarizingInt(User::getScore) ));
结果是一个 Map<地区, IntSummaryStatistics>,每个地区都自带五维统计。遍历时直接调用 stats.getA verage() 等方法就行,不用自己手动算均值或找极值。
空流与异常值要主动兜底
SummaryStatistics 对空流是友好的——getA verage() 返回 0.0,getMin() 等返回极端值。不过业务上往往需要明确语义:
- 如果空结果应该报错或跳过,可以在调用前加
if (list.isEmpty()) throw … - 如果数据里含有负数或异常值(比如 -1 表示“未填写”),建议先
filter(x -> x > 0)再统计 - 平均值保留小数位,推荐用
String.format("%.2f", stats.getA verage()),不必用BigDecimal过度复杂化


































