JDK8概览
1. Lambda表达式
2.Optional
3.Stream
- 创建Stream
- 最终构建的是一个 ReferencePipeline.Head 对象
- 后接 0个 或 多个 中间操作 (下面以map方法为例,其他方法的逻辑大部分与之相似)
- 构造 1个 StatelessOp 对象(ReferencePipeline 的内部类)
- 实质上是构建一个用于中间操作的 ReferencePipeline (ReferencePipeline 的构造方法二)
- 同时重写 opWrapSink 方法
- 构建并返回一个 Sink.ChainedReference 对象
- 重写 accept 方法
- 由于出现终止操作时,Sink 会由结尾阶段往前调用,因此传入的参数的类型为 P_OUT
- 重写 accept 方法
- 构建并返回一个 Sink.ChainedReference 对象
- 构造 1个 StatelessOp 对象(ReferencePipeline 的内部类)
- 最后添加 1个 终止操作
- 若没有终止操作,stream 只构建了一系列的对象,并没有触发调用对象里面的方法,因此 stream 什么也不会做
- 当终止操作前没有中间操作时,出于效率上的考量,直接对数据源进行遍历
- 当存在中间操作时
- 通过 TerminalOp 的构造工厂,获取对应的 TerminalOp
- 调用 TerminalOP 中的 evaluateSequential 方法
- 调用 PipelineHelper 的 wrapAndCopyInto 方法(ReferencePipeline 实现了 PipelineHelper接口 )对数据进行遍历
- collect 方法(TODO......)