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 类似

 

posted @ 2019-11-02 15:59  飞蛇在水  阅读(462)  评论(0编辑  收藏  举报