java8 stream分析

1.基本用法
有id集合,去除id为3的数值.如果是非stream用法代码如下:


image.png

新的用法:


image.png

2.stream流程
list-->stream-->中间操作(ReferencePipeline)-->结束操作(TerminalOp);
我们以上面截图的ArrayList为例说明;
1.首先是创建stream
在ArrayList.stream()中,我们看源码其实是调用了基类的Collection.stream()来创建Strem对象,同时ArrayList重写了生成Spliterator类的生成(使用迭代子模式)


image.png

2.生成stream的过程其实是创建ReferencePipeline的过程(ReferencePipeline有三个实体类Head,StatelessOp, StatefulOp)Arrays.stream其实是创建ReferencePipeline.Head的过程,通过查看StreamSupport.stream得知


image.png

3.接下来查看filter方法(无状态流程)
点击filter方法查看,filter是创建StatelessOp(无状态)类


image.png

4.ReferencePipeline,也称为中间操作。如果熟悉建造模式,其实关键点是build方法,因为它开始了整个流程。在stream里面也一样,中间操作只是记录了将要对集合进行的操作,至于什么时候开始是由结束操作(TerminalOp)来决定的.
这里我们以collect()方法为例说明.


collect方法

我们以非并发为例说明。
ReduceOps.makeRef(collector)是生成一个结束操作(TerminalOp)。


image.png

然后我们回到AbstractPipeline.evaluate方法。
evaluate方法

在这里我们可以看到调用的其实是TerminalOp.evaluateSequential方法

然后回头看看TerminalOp.evaluateSequential的具体操作


evaluateSequential方法

调用的是PipelineHelper.wrapAndCopyInto方法.
ReferencePipeline结构

我们从ReferencePipeline可以看到ReferencePipeline继承了PipelineHelper类。所以helper.wrapAndCopyInto(makeSink(), spliterator).get()调用的是ReferencePipeline类(具体来说是AbstractPipeline)的wrapAndCopyInto方法.
wrapAndCopyInto方法

然后来看下wrapsink包装sink(装饰器模式)。意思就是把之前中间操作和结束操作通过链表的方式连接起来
wrapsink方法

然后我们回到copyinto方法.


copyinto

copyinto方法就是遍历spliterator的值,然后执行ReferencePipeline和TerminalOp设定的操作。最后通过TerminalOp设定的操作收集数据。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容