TerminalOP接口
TerminalOP
说明文档
- 一个在流管道中的操作,它会接收一个流作为输入,并且生成一个结果或产生副作用
-
一个 TerminalOp 拥有一个输入类型和流模型和结果类型
-
一个 TerminalOp 还拥有一组操作标识,用于描述操作如何处理流中的元素
-
例如:短路、以指定顺序执行
-
-
一个 TerminalOp 必须提供涉及流源的操作和一组中间操作的串行与并行的实现
接口方法
- <P_IN> R evaluateSequential(PipelineHelper<E_IN> helper, Spliterator<P_IN> spliterator);
实现类
ForEachOp
ForEachOps 中的静态内部类
实现了 TerminalOp、TerminalSink(继承 Sink 和 Supplier 接口)
实际上,就是一个 Sink
说明文档
- 计算一个流管道,并且讲输出发送给自身作为一个 TerminalSink
-
元素会发送给任意一个线程
-
若遍历是无序的,则发送时不依赖于特定的顺序
-
此终止操作是无状态的
-
对于并行的操作,每一个将要发送元素到同一个 TerminalSink 引用的 forEachTask 的叶子实例,都会是当前类的一个实例
evaluateSequential
传入的 helper 为最后一个中间操作的 ReferencePipeline,spliterator 为 AbstractPipeline 的 sourceSpliterator 方法获取的最后一个中间操作的源 spliterator
@Override public <S> Void evaluateSequential(PipelineHelper<T> helper, Spliterator<S> spliterator) { return helper.wrapAndCopyInto(this, spliterator).get(); }
- 最终调用的是 ReferencePipeline 的 wrapAndCopyInto 方法
- 由于 forEach 无返回值,因此使用 Void 填充,然后通过 get 方法,返回 null
FindOps, MatchOps, ReduceOps
TerminalOp 的构造工厂,与 ForEachOps 类似