Java Stream API的Collectors是可组合、嵌套、定制的统计中枢,支持分组聚合、多级分组、空值处理及百分比计算等高级功能。

Java Stream API 的 Collectors 是数据聚合的“核心引擎”,不是简单收尾工具,而是能组合、嵌套、定制的统计中枢。用对了,一行代码就能替代十几行循环+Map手动维护。
基础统计:不止是 count() 和 toList()
count() 方法直接返回 long,适合单次计数;但 Collectors.counting() 是收集器,可嵌入 groupingBy 等复合操作中——这才是它不可替代的价值。
- 统计每类数量:用 groupingBy(key, counting()),返回 Map
- 汇总数值字段:如总分、总价,用 summingInt(User::getScore) 或 summingDouble(Order::getAmount)
- 获取完整统计摘要:用 summarizingInt(User::getAge),一次性返回 count、min、max、sum、average
分组+聚合:避免手写 for 循环
单纯分组(groupingBy)只返回 Map
- 按地区分组并统计人数:groupingBy(User::getRegion, counting())
- 按部门分组并求平均薪资:groupingBy(Person::getDept, averagingDouble(Person::getSalary))
- 按状态分组并取最高订单额:groupingBy(Order::getStatus, maxBy(Comparator.comparingDouble(Order::getTotal)))
- 保留原始对象列表同时支持后续处理:groupingBy(User::getRegion) → 得到 Map
>
比例计算:频次转百分比的两种写法
分组计数后想算占比?关键在“总数”和“映射转换”的时机。
立即学习“Java免费学习笔记(深入)”;
- 先手动算总数再遍历:用 stream.count() 得 total,再对 groupingBy(..., counting()) 结果做 entry.getValue() * 100.0 / total
- 更函数式写法:用 collectingAndThen(groupingBy(..., counting()), map -> { ... }) 把转换逻辑封装进收集器,流式链路不断开
多级分组与自定义聚合
真实业务常需“先按A分、再按B细分”,或一次聚合多个指标(如:每月订单数 + 总金额)。
- 两级分组:如 groupingBy(User::getRegion, groupingBy(User::getLevel)) → Map
>> - 同级多指标:用 reducing 或自定义 Collector,例如封装 DTO 包含 count 和 sum 字段
- 空值安全:分组键可能为 null?加判空逻辑或用 groupingBy(user -> user.getRegion() != null ? user.getRegion() : "UNKNOWN")


















