IntStream.summaryStatistics() 一次性计算整数流的计数、最小值、最大值、总和与平均值,返回缓存结果的IntSummaryStatistics对象,避免多次遍历不可重用流。
intstream.summarystatistics() 是 java 8 引入的便捷方法,能一次性计算整数流的多个基础统计值:计数、最小值、最大值、总和与平均值。它返回一个 intsummarystatistics 对象,内部已缓存全部结果,无需多次遍历流——这对不可重用的流(如来自文件或随机生成的流)尤其关键。
调用方式与基本用法
只需在 IntStream 后链式调用 summaryStatistics(),然后通过对应 getter 方法获取所需值:
-
getCount():元素个数(long类型) -
getMin():最小值(int,空流时为Integer.MAX_VALUE) -
getMax():最大值(int,空流时为Integer.MIN_VALUE) -
getSum():总和(long,注意溢出风险) -
getAverage():平均值(double,空流时为0.0)
示例:
IntStream stream = IntStream.of(2, 4, 6, 8, 10);
IntSummaryStatistics stats = stream.summaryStatistics();
System.out.println("count: " + stats.getCount()); // 5
System.out.println("min: " + stats.getMin()); // 2
System.out.println("max: " + stats.getMax()); // 10
System.out.println("sum: " + stats.getSum()); // 30
System.out.println("average: " + stats.getAverage()); // 6.0
处理空流与边界情况
空流不会抛异常,但极值会返回默认哨兵值,需主动判断是否有效:
- 若
getCount() == 0,说明流为空,此时getMin()/getMax()的值无业务意义 -
getAverage()在空流时返回0.0,但通常应视为未定义;建议先校验计数再使用平均值 -
getSum()对空流返回0L,符合直觉,可直接使用
安全写法示例:
IntSummaryStatistics stats = IntStream.empty().summaryStatistics();
if (stats.getCount() > 0) {
System.out.printf("Avg=%.2f, range=[%d,%d]%n",
stats.getAverage(), stats.getMin(), stats.getMax());
} else {
System.out.println("No data available");
}
与多次终端操作对比的优势
不使用 summaryStatistics() 时,若分别调用 count()、min()、max() 等,会导致流被多次消费——而 IntStream 是**单次消费**的,重复调用会抛 IllegalStateException。必须借助 boxed().collect(...) 或中间缓存(如转为数组),增加内存与代码复杂度。
summaryStatistics() 在一次遍历中完成全部计算,时间复杂度 O(n),空间 O(1),是标准库提供的高效、简洁方案。
注意事项与常见陷阱
-
流必须是 IntStream:不能对
Stream<Integer>直接调用,需先用mapToInt(Integer::intValue) -
平均值精度:返回
double,但底层按整数累加后除以计数,无浮点累积误差 -
总和溢出:
getSum()返回long,但累加过程仍按int运算,超Integer.MAX_VALUE会静默溢出;如需大数安全,应改用LongStream或自定义收集器 -
不可用于并行流的精确统计? 实际上
summaryStatistics()完全支持并行流,其Collector实现保证了合并逻辑的正确性


















