Java Stream 流水线设计是延迟执行的描述式编程模型,由源、中间操作链和终端操作三部分构成,通过Sink嵌套链执行,结合构建器、策略、观察者和流水线模式实现可组合性与灵活性。

Java Stream 的流水线设计不是为了“立刻干活”,而是为了“说清楚怎么干”。它把数据处理拆成可插拔、可组合、可延迟的环节,核心在于描述逻辑而非执行动作。
流水线由三部分明确构成
每条 Stream 链都天然包含三个角色:
-
源(Source Stage):比如
list.stream()或Arrays.stream(arr),只负责提供数据入口,不参与计算,内部封装的是一个Spliterator。 -
中间操作链(Intermediate Stages):如
filter、map、sorted,每个都是独立 Stage,只记录“做什么”和“上游是谁”,不做实际处理。 -
终端操作(Terminal Operation):如
collect、forEach、toArray,是唯一触发整条链执行的开关,没有它,前面所有调用只是在搭蓝图。
真正干活的是 Sink,不是 Stage
Stage 负责“描述”,Sink 才负责“执行”。终端操作启动后,系统从最后一个 Stage 开始,反向调用 opWrapSink(downstream),一层层把下游 Sink 包装进来,形成嵌套链。例如:
filter(f).map(m).collect() 实际构建的是:
CollectSink ← MapSink ← FilterSink ← SourceSpliterator
数据流经时,每个 Sink 各司其职:FilterSink 判断是否留下,MapSink 负责转换,CollectSink 收集结果——彼此解耦,职责清晰。
立即学习“Java免费学习笔记(深入)”;
懒加载 + 设计模式 = 可组合性
流水线的灵活性来自多种模式协同:
-
构建器模式:链式调用
stream().filter().map().collect()就是在逐步配置流水线蓝图。 -
策略模式:
Predicate、Function等函数式接口让行为可插拔,算法与数据彻底分离。 - 观察者模式:终端操作作为触发点,“通知”整个链条开始执行,实现松耦合响应。
- 流水线模式(核心):每个 stage 只关注输入→处理→输出,便于调试、优化、并行化。
有状态操作会影响执行方式
并非所有中间操作都一样:
-
无状态操作(如
filter、map):每个元素处理互不影响,可任意分片并行,性能友好。 -
有状态操作(如
sorted、distinct、limit):需看到全部或部分前置数据才能决定当前行为,会引入缓冲或全局协调,可能削弱并行效果。
比如 parallelStream().sorted().filter(...) 中,sorted 会强制先完成全局排序,再进入后续步骤,此时并行优势可能被抵消。


















