java stream收集器是流水线终点,支持多级分组、统计聚合与自定义逻辑;通过下游收集器嵌套实现如groupingby+partitioningby、summarizingdouble等复杂操作,并可借助collectingandthen、mapping等组合优化归约流程。

Java Stream API 的收集器(Collector)是流水线的终点,也是最灵活、最具表现力的部分。它不只负责“把流变成集合”,而是能完成分组、分区、统计、嵌套聚合甚至自定义逻辑——关键在于理解下游收集器(downstream collector)如何嵌套组合。
多级分组与嵌套收集
单层分组用 groupingBy 很常见,但真实业务常需多维度切分。比如先按部门分组,再在每个部门内按薪资是否达标做二分:
- 第一层用
Collectors.groupingBy(Employee::getDepartment) - 第二层传入下游收集器,如
Collectors.partitioningBy(e -> e.getSalary() >= 6500) - 最终类型是
Map<string map list>>></string>,结构清晰,无需手动嵌套循环
统计类收集器直接输出聚合指标
避免手写循环求平均值、最大值或计数。内置的统计收集器一次到位:
-
summarizingDouble(Employee::getSalary)返回DoubleSummaryStatistics,含 count/sum/min/max/average -
averagingInt(Person::getAge)直接得 double 类型均值 -
summingLong(Order::getAmount)避免装箱开销,比 mapToInt + sum 更简洁
下游收集器组合实现复杂归约
收集器可层层嵌套,形成“分组 → 汇总 → 转换”的完整链路:
- 按城市分组后,对每个城市的订单金额求和并转成 BigDecimal:
groupingBy(Order::getCity, mapping(Order::getAmount, collectingAndThen(summingLong(), BigDecimal::valueOf))) - 用
collectingAndThen在归约完成后做一次后处理,比如格式化或类型转换 -
mapping和flatMapping(Java 9+)可提前投影字段或展开结构,减少中间对象创建
自定义收集器应对特殊聚合需求
当内置收集器无法满足时,可通过实现 Collector 接口定义行为。核心四要素必须明确:
- supplier:提供累加器初始容器(如 new HashMap)
- accumulator:定义如何把每个元素加入容器(如按首字母 put 到 map)
- combiner:并行流中合并两个部分结果(如 map.putAll(other))
- finisher:最终结果封装(如返回不可变 map 或计算平均值)
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











