Stream 流程
2020-09-14 15:32:41 0 举报
Java 8 stream 源码流程
作者其他创作
大纲/内容
super()
OfRef
ArrayListSpliterator
8. 重复步骤 6 流程,创建新的中间操作节点,并形成操作记录的双向链表
14. invoke()
ForEachOps
3. new ReferencePipeline.Head()
12. new ForEachTask()
11. terminalOp.evaluateSequential()
p.opWrapSink()
10.2 父类 evaluate()
调用父类方法
4. super()
ReferencePipeline
15. 该步骤会开启循环对任务进行估算,然后fork()分解大任务,直到任务足够小才执行
ArrayList
ForEachOp
15. compute()
ForkJoinTask
5. super()
Sink.ChainedReference
13. wrapSink()
8. map()
Stream 的操作链表 Head 头节点生成
6. filter()
对数据源中的每个元素依次调用每个 Sink 的 accept() 方法,完成对数据的处理,并调用下游Sink(downStream)的 accept() 方法
ForEachTask
Head
7. new StatelessOp()
14. wrapSink()从操作链表的尾部开始,调用操作对象自身重写的 opWrapSink()方法将每一个操作对象中的数据处理逻辑封装成 Sink.ChainedReference,并将传入的 Sink 作为新建 Sink 的 downStream,从而形成单向调用链
14. wrapSink()
16. task.helper.copyInto()
14. copyInto 分为两个分支:1. 如果流中没有短路操作,则依次调用 font color=\"#ff3333\
StatelessOp
13. wrapSink()从操作链表的尾部开始,调用操作对象自身重写的 opWrapSink()方法将每一个操作对象中的数据处理逻辑封装成 Sink.ChainedReference,并将传入的 Sink 作为新建 Sink 的 downStream,从而形成单向调用链
9. forEach()
14. 进入 ForkJoinPool 并发框架,此处不再分析其内部流程
12. helper.wrapAndCopyInto()
AbstractPipeline
13. helper.wrapSink(this)
1. stream()
new ForEachOp.OfRef()
16. action.accept()
11. terminalOp.evaluateParallel()
18. action.accept()
StreamSupport
14. copyInto()
1. parallelStream()
10.1 ForEachOps.makeRef()
2. StreamSupport.stream()
15. spliterator.forEachRemaining()
17. spliterator.forEachRemaining()
0 条评论
回复 删除
下一页