https://gitbook.cn/gitchat/activity/5f8fc6cd1f577d4d9f428562
从底层,从原理,我们来重学一次 Java。Stream 是JDK8中新引入的,方便了数据列表的过滤、投影、遍历等各种处理,他的源码及实现是怎样的呢?
本系列秉承所有结论尽量从源码中来,没有源码的尽量标明出处。相关源码会附着在文章中,读本文即可,不用再自行查找源码及资料学习,方便大家充分利用路上的碎片时间。
本篇 Chat 分析了并行 forEach 各种情况的源码逻辑,以及流标记类StreamOpFlag,帮助大家深入理解和学习 JDK 源码。
本文包含以下内容:
并行forEach AbstractPipeline.parallel()ReferencePipeline.Head.forEach(Consumer<? super E_OUT> action)AbstractPipeline.isParallel()ReferencePipeline.forEach(Consumer<? super E_OUT> action)AbstractPipeline.evaluateForEachOps.ForEachOp.evaluateParallelForEachTaskForkJoinTask.invokeForkJoinTask.doInvokeForkJoinTask.doExecCountedCompleter.execForEachTask.computeSpliterators.ArraySpliteratorAbstractPipeline.copyIntoForEachOp.OfRef拆分任务的执行 ForkJoinWorkerThread.runForkJoinPool.runWorkerForkJoinPool.WorkQueue.runTaskForkJoinTask.doExec()CountedCompleter.exec堆栈信息 并行进行一次中间操作的forEach ReferencePipeline.filterReferencePipeline.forEach(Consumer<? super E_OUT> action)AbstractPipeline.evaluateForEachOps.ForEachOp.evaluateParallelForEachTaskForkJoinTask.invokeForkJoinTask.doInvokeForkJoinTask.doExecCountedCompleter.execForEachTask.computeSpliterators.ArraySpliteratorAbstractPipeline.copyIntoSpliterators.ArraySpliterator.forEachRemainingForEachOp.OfRef拆分任务的执行 ForkJoinWorkerThread.runForkJoinPool.runWorkerForkJoinPool.WorkQueue.runTaskForkJoinTask.doExec()CountedCompleter.exec堆栈信息 StreamOpFlag 创建流标记处理流时判断类定义说明枚举值 DISTINCTSORTEDORDEREDSIZED保留位SHORT_CIRCUIT Type标志int常量set(Type t)MaskBuilder掩码表获取特征判断函数掩码标记getMask(int flags)toCharacteristics(int streamFlags)fromCharacteristics(Spliterator<?> spliterator)fromCharacteristics(int characteristics)