发布于2026-06-23 阅读(0)
扫一扫,手机访问
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
对应 double 和 long 类型,API 完全一致,只是返回值类型匹配:
DoubleSummaryStatistics:适用于浮点运算、带小数的指标(比如响应时间、评分)LongSummaryStatistics:适合大整数统计,比如用户ID计数、金额累计(避免 int 溢出)不过要注意:DoubleSummaryStatistics 中 getMin()/getMax() 对 NaN 和无穷值有特殊处理逻辑,实际使用中最好提前过滤掉异常值。
如果想像按类别分别看统计?把 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 …filter(x -> x > 0) 再统计String.format("%.2f", stats.getA verage()),不必用 BigDecimal 过度复杂化
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8