Java Stream统计汇总:SummaryStatistics全能应用
JavaStream的summaryStatistics()一次遍历获取计数、总和、平均值、最小值、最大值,避免重复消费。基础类型流直接调用,引用类型用Collectors.summarizingInt等。空流时getMin()/getMax()抛异常,需先判断getCount()>0。combine()支持合并统计对象,适合并行计算。
自然引入,后续h3标题只用于原有小节,没有强行新增。
Ja va Stream 的summaryStatistics()是解决多维统计的刚需工具——一次遍历就能拿到计数、总和、平均值、最小值、最大值,省得反复消费流或者手写归约逻辑。需要特别注意的是,空流时getMin()和getMax()会抛异常,得提前做判断。

乍一看,summaryStatistics() 似乎只是锦上添花的小工具,但在实际项目中,它往往是处理多维统计的「硬通货」。用一次遍历,同时拿到计数、总和、平均值、最大值、最小值,既避免了重复消费流,也省去了手写归约的麻烦。那么,具体怎么用?可以分几种场景来看。
基础用法:IntStream / DoubleStream / LongStream 直接调用
如果你处理的是基本类型数据,最简单的方式就是直接调用对应流上的 summaryStatistics() 方法。前提是先通过 mapToInt()、mapToDouble() 等操作转换成基本类型流——这一步必不可少。
- 对
List做统计:stream().mapToInt(Integer::intValue).summaryStatistics() - 对
List做统计:stream().mapToDouble(Double::doubleValue).summaryStatistics() - 空流会返回一个有效对象(
getCount() == 0),但此时调用getMin()或getMax()会抛出NoSuchElementException。所以,拿到结果后最好先检查一下getCount()是否大于 0。
Collectors 收集器:更灵活的流式聚合入口
如果原始数据是引用类型——比如 Person 对象,或者你需要在复杂的管道中嵌入统计逻辑,那 Collectors.summarizingInt() 这类收集器就更顺手。它直接作用于 Stream,省去显式类型转换的麻烦。
summarizingInt(Person::getAge)→ 返回IntSummaryStatisticssummarizingDouble(Product::getPrice)→ 返回DoubleSummaryStatistics- 还能和其他收集器组合使用,比如
groupingBy(dept, summarizingDouble(Product::getPrice)),实现按部门分组后每组独立统计——这在报表类场景中特别常见。
核心字段与安全访问
IntSummaryStatistics 等几个类提供了统一的接口:getCount()、getSum()、getA verage()、getMin()、getMax()。不过几个细节需要注意:
getA verage()返回double,空流时返回0.0(不是NaN,这就意味着你不能靠它判断流是否为空)getMin()和getMax()在空流上调用会抛异常,安全做法是先判断getCount() > 0- 所有 getter 方法都是线程安全的,在并行流中也可以放心使用
进阶技巧:combine 合并与流式构建
当面对分片数据、并行计算或者增量更新时,accept() 和 combine() 方法能派上大用场。简单来说:
stats.accept(value)可以向已有的统计对象追加一个数值stats1.combine(stats2)可以将两个统计对象合并成一个——这特别适合 ForkJoinPool 或 MapReduce 场景- 实践中常用来自定义 Collector,或者处理大数据分块汇总,比如读取多个文件后把每个文件的统计结果合并起来
这几个方法虽然不显眼,但一旦遇到需要多路聚合或增量计算的场景,就能省下不少手写合并逻辑的时间。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















