java stream合并本质是规约,分concat(两流拼接)、flatmap(嵌套展平)、reduce/collect(状态累积)三类;concat轻量但限两流,flatmap适用动态合并,collect因支持可变容器和终值加工更适生产。

Java Stream API 中的合并逻辑本质上是规约(reduction)的一种表现形式,核心在于将多个输入按规则聚合成一个结果。它不等于简单拼接,而是围绕“如何准备容器、如何加入元素、如何合并中间态、如何产出终值”四步展开,尤其在自定义收集器或复杂归约中体现得最清晰。
concat():适合确定数量的顺序拼接
当只需把两个已知流首尾相连时,Stream.concat() 是最轻量的选择。它不触发归约过程,只是逻辑上延长流管道:
- 仅接受两个同类型 Stream 参数,返回新 Stream,原流不受影响
- 底层不缓存数据,延迟执行,内存友好
- 不适用于动态数量的流合并(如 List
>),嵌套调用可读性差
flatMap():处理嵌套结构与一对多映射
真正承担“合并”语义的主力是 flatMap(),它把每个元素映射为一个 Stream,再自动展平成单一流。这是实际开发中最常用于合并的手段:
- 合并多个 List:Stream.of(list1, list2, list3).flatMap(List::stream)
- 合并对象集合的子集合:users.stream().flatMap(u -> u.getRoles().stream())
- 条件性合并单值与列表:event -> event.isActive() ? Stream.of(funca(event)) : funcb(event).stream()
reduce() 与 collect():面向状态累积的深度合并
当合并需携带中间状态(如去重、排序、TopK、分组统计),就进入规约层面。两者分工明确:
- reduce() 适合无状态、纯函数式聚合,如求和、拼接字符串、找最大值;但无法直接返回 List 或 Map 等复杂结构
- collect() 基于 Collector,天然支持可变容器(ArrayList、HashMap)、线程安全(并行流)、终值加工(finisher),是生产环境首选
- 自定义 Collector 推荐用 Collector.of(),四参数分别对应 supplier/accumulator/combiner/finisher,避免手写接口
选对累加器,合并才真正高效
Collector 的性能瓶颈常不在逻辑,而在累加器选型。关键原则是:让容器类型贴近业务状态,减少包装与转换:
- 计数用 int[1] 或 AtomicInteger,避免 Integer 频繁装箱
- TopN 场景直接用 PriorityQueue,插入即堆化,无需后期排序
- 字符串拼接用 StringBuilder,比 String + 更低开销
- 分组+多指标汇总用 Map
,数组索引存 sum/min/max/count,避免对象膨胀
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











