java stream api 通过 collectors 工具类支持对集合属性的统计汇总,包括求和、平均值、最值、计数、分组、拼接等;优先使用 summingint/long/double 等专用收集器,结合 groupingby 实现多级分组与嵌套统计,并注意空集合处理、装箱开销及并行安全。

Java Stream API 提供了简洁、函数式的方式来对集合中对象的属性进行统计汇总,比如求和、平均值、最大最小值、计数、分组、拼接等。关键在于结合 Collectors 工具类与方法引用(如 Person::getAge)或 Lambda 表达式,将流式操作“收口”为所需结果。
基础数值型属性统计(sum/average/max/min/count)
对 int、long、double 类型属性,优先使用 Collectors.summingInt/Long/Double 等专用收集器,它们比先 mapToInt() 再调用 sum() 更简洁且可直接用于 collect()。
-
求和:
list.stream().collect(Collectors.summingInt(Person::getAge)) -
平均值:
list.stream().collect(Collectors.averagingDouble(Person::getSalary))(返回Double,空集合时为NaN) -
最大值/最小值:
list.stream().collect(Collectors.maxBy(Comparator.comparing(Person::getAge)))(返回Optional<person></person>) -
计数:
list.stream().filter(p -> p.getAge() > 18).count()或.collect(Collectors.counting())
多维度汇总:使用 Collectors.groupingBy + downstream collector
按某个属性分组后,对每组内对象的另一属性做统计,是常见需求。通过嵌套收集器实现,例如按部门分组并统计各组平均薪资:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Map<string double> deptAvgSalary = list.stream()<br> .collect(Collectors.groupingBy(Person::getDept, Collectors.averagingDouble(Person::getSalary)));</string>
- 支持多级分组:
groupingBy(Person::getDept, groupingBy(p -> p.getAge() / 10 * 10 + "s", counting()))→ 按部门再按年龄段分组计数 - 避免空指针:若分组键可能为
null,可用Collectors.groupingBy(Objects::toString, ...)或提前过滤
自定义汇总:Collectors.collectingAndThen 或自定义 Collector
当内置收集器不满足需求(如计算中位数、标准差、去重后求和),可通过 collectingAndThen 对中间结果二次加工,或实现 Collector 接口。
-
后处理转换:
list.stream().collect(collectingAndThen(averagingDouble(Person::getSalary), Math::round))→ 返回四舍五入后的长整型平均值 -
去重求和:
list.stream().map(Person::getSalary).distinct().mapToDouble(Double::doubleValue).sum()(简单场景可不用自定义) -
复杂状态聚合:例如同时统计总人数、平均年龄、最高薪资,可创建一个容器类(如
Summary),配合Collector.of()实现累加逻辑
注意事项与性能提示
Stream 统计虽简洁,但需注意语义与效率边界:
-
空集合处理:
summingXxx返回 0,averagingXxx返回NaN,maxBy/minBy返回Optional.empty(),应显式检查 -
装箱开销:对基本类型属性,尽量用
summingInt而非mapToInt(...).sum(),前者在收集阶段避免中间IntStream创建 -
并行慎用:多数
Collectors是并发安全的,但自定义收集器需确保combiner正确;且小数据量下并行流未必更快 -
不可变性:所有标准收集器生成的结果(如
HashMap、LinkedHashMap)默认不保证线程安全,如需共享请包装为Collections.unmodifiableMap()
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










