Java Stream的summaryStatistics()是解决多维统计的刚需工具,一次遍历即可获取计数、总和、平均值、最大值、最小值;支持基本类型流原生调用及Collectors收集器灵活聚合,空流需注意getMin()/getMax()异常。

Java Stream 的 summaryStatistics() 不是“锦上添花”,而是解决多维统计需求的刚需工具——它用一次遍历,同时拿到计数、总和、平均值、最大值、最小值,避免重复消费流或手写归约逻辑。
基础用法:IntStream / DoubleStream / LongStream 直接调用
基本类型流(IntStream、DoubleStream、LongStream)原生支持 summaryStatistics(),无需额外依赖。关键前提是先通过 mapToInt()、mapToDouble() 等转换为对应基本类型流。
- 对
List<Integer>统计:用stream().mapToInt(Integer::intValue).summaryStatistics() - 对
List<Double>统计:用stream().mapToDouble(Double::doubleValue).summaryStatistics() - 空流会返回有效对象(
getCount() == 0),但getMin()/getMax()在空时抛NoSuchElementException,需提前判断
Collectors 收集器:更灵活的流式聚合入口
如果原始数据是引用类型(如 Person),或需要在复杂管道中嵌入统计,推荐用 Collectors.summarizingInt() 等收集器。它直接作用于 Stream<T>,省去显式类型转换。
-
summarizingInt(Person::getAge)→ 返回IntSummaryStatistics -
summarizingDouble(Product::getPrice)→ 返回DoubleSummaryStatistics - 可与其他收集器组合,例如
groupingBy(dept, summarizingDouble(Product::getPrice))实现分组后每组独立统计
核心字段与安全访问
IntSummaryStatistics 等类提供统一接口:getCount()、getSum()、getAverage()、getMin()、getMax()。注意:
立即学习“Java免费学习笔记(深入)”;
-
getAverage()返回double,空流时为0.0(不是NaN) -
getMin()和getMax()在空流上调用会抛异常,建议先检查getCount() > 0 - 所有 getter 方法都是线程安全的,适合在并行流中使用
进阶技巧:combine 合并与流式构建
当处理分片数据、并行计算或增量更新时,accept() 和 combine() 方法非常实用:
-
stats.accept(value)可向已有统计对象追加单个数值 -
stats1.combine(stats2)将两个统计对象合并(适用于 ForkJoinPool 或 MapReduce 场景) - 常用于自定义 Collector 或处理大数据分块汇总,比如读取多个文件后合并各文件的统计结果


















