java自定义collector旨在精准匹配业务逻辑,核心是拆解“准备容器→加元素→合并→产出”四步,通过collector.of()传入supplier、accumulator、combiner、finisher四个函数实现,支持性能优化与并行安全特性声明,并可嵌套组合现有收集器处理层级聚合。

Java自定义Collector不是为了“造轮子”,而是让Stream的收集行为精准匹配业务逻辑。它不强制你写新类,核心是把“准备容器→加元素→合并中间结果→产出终值”这四步拆开定义,既清晰又可控。
用Collector.of()快速组装逻辑
90%以上的自定义场景,直接调用Collector.of()就够了。它接收四个函数式参数:
-
supplier:提供初始容器,比如
ArrayList::new、() -> new int[1]或AtomicInteger::new -
accumulator:定义单个元素怎么进容器,例如
(list, e) -> list.add(e)或(count, e) -> count.incrementAndGet() -
combiner:并行时合并两个中间容器,如
(a1, a2) -> { a1.addAll(a2); return a1; } -
finisher:把最终容器转成你要的结果,比如
list -> list.stream().sorted().limit(10).toList()
如果finisher只是返回原容器(比如直接返回ArrayList),可传入Characteristics.IDENTITY_FINISH跳过转换,提升性能。
累加器类型A可以很轻量
A不一定要是专门写的类。根据需求选合适载体:
- 统计计数:用
int[1]或AtomicInteger,避免装箱开销 - 收集字符串拼接:用
StringBuilder,比String更高效 - 分组+聚合:用
HashMap<k atomicinteger></k>或ConcurrentHashMap支持并发 - TopN场景:用
PriorityQueue代替全排序,时间复杂度更低
并行与特性声明要对得上
并行流能否安全运行,取决于你是否正确声明characteristics:
- 用
CONCURRENT:表示累加器本身线程安全(如ConcurrentHashMap::new),此时combiner可能被跳过 - 用
UNORDERED:说明结果顺序无关,允许JVM优化执行路径(比如用HashSet替代LinkedHashSet) - 用
IDENTITY_FINISH:finisher是恒等函数,省去一次对象转换
错标特性可能导致数据丢失或结果错乱,尤其在高并发场景下。
嵌套收集器处理层级聚合
多级归约不用手写循环,靠组合现有收集器即可:
- 先按部门分组,再算每组平均薪资:
groupingBy(Employee::dept, averagingDouble(Employee::salary)) - 分组后取每组Top3:
groupingBy(Person::city, collectingAndThen(toCollection(() -> new PriorityQueue(3, Comparator.reverseOrder())), pq -> pq.stream().limit(3).toList()))
这种“下游收集器处理上游结果”的方式,天然支持分治,也便于复用和测试。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











