一聚教程网:一个值得你收藏的教程网站

热门教程

Java Stream API数值统计:SummaryStatistics应用实践

时间:2026-06-25 10:28:51 编辑:袖梨 来源:一聚教程网

IntSummaryStatistics可一次性获取计数、总和、最小值、最大值和平均值;支持mapToInt后调用summaryStatistics(),线程安全且API简洁,适用于报表、监控等场景。

Java Stream API 的 SummaryStatistics 是做数值统计最省心的工具之一——它不单算一个值,而是一次性打包返回计数、总和、最小值、最大值和平均值,特别适合报表生成、监控指标汇总或数据探查场景。

IntSummaryStatistics 最常用也最典型

处理 int 类型时,首选 IntSummaryStatistics。它轻量、线程安全(可调用 accept()combine() 动态累加),且所有字段都直接可用:

  • getCount():元素个数(long 类型)
  • getSum():总和(int
  • getMin() / getMax():极值(空流时默认为 Integer.MAX_VALUE / Integer.MIN_VALUE,需注意边界)
  • getAverage():自动计算的平均值(double,空流返回 0.0

用法很简单:先用 mapToInt() 转成数值流,再调用 summaryStatistics()

List<Integer> scores = 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.getAverage()));// 输出:共 5 人,最高 96,最低 78,平均 87.80

DoubleSummaryStatistics 和 LongSummaryStatistics 同理

对应 doublelong 类型,API 完全一致,只是返回值类型匹配:

立即学习“Java免费学习笔记(深入)”;

  • DoubleSummaryStatistics:适用于浮点运算、带小数的指标(如响应时间、评分)
  • LongSummaryStatistics:适合大整数统计,比如用户ID计数、金额累计(避免 int 溢出)

注意:DoubleSummaryStatisticsgetMin()/getMax()NaN 和无穷值有特殊处理逻辑,实际使用中建议提前过滤异常值。

结合 groupingBy 实现分组汇总

想按类别分别看统计?把 SummaryStatistics 当作聚合器传给 Collectors.collectingAndThen 或直接嵌套在 groupingBy 里:

Map<String, IntSummaryStatistics> regionStats = users.stream()    .collect(Collectors.groupingBy(        User::getRegion,        Collectors.summarizingInt(User::getScore)    ));

结果是一个 Map<地区, IntSummaryStatistics>,每个地区都自带五维统计。遍历时可直接调用 stats.getAverage() 等方法,无需手动算均值或找极值。

空流与异常值要主动兜底

SummaryStatistics 对空流是友好的(getAverage() 返回 0.0getMin() 等返回极端值),但业务上往往需要明确语义:

  • 若空结果应报错或跳过,可在调用前加 if (list.isEmpty()) throw …
  • 若含负数或异常值(如 -1 表示“未填写”),建议先 filter(x -> x > 0) 再统计
  • 平均值保留小数位推荐用 String.format("%.2f", stats.getAverage()),避免 BigDecimal 过度复杂化

热门栏目