1.基本用法
有id集合,去除id为3的数值.如果是非stream用法代码如下:
新的用法:
2.stream流程
list-->stream-->中间操作(ReferencePipeline)-->结束操作(TerminalOp);
我们以上面截图的ArrayList为例说明;
1.首先是创建stream
在ArrayList.stream()中,我们看源码其实是调用了基类的Collection.stream()来创建Strem对象,同时ArrayList重写了生成Spliterator类的生成(使用迭代子模式)
2.生成stream的过程其实是创建ReferencePipeline的过程(ReferencePipeline有三个实体类Head,StatelessOp, StatefulOp)Arrays.stream其实是创建ReferencePipeline.Head的过程,通过查看StreamSupport.stream得知
3.接下来查看filter方法(无状态流程)
点击filter方法查看,filter是创建StatelessOp(无状态)类
4.ReferencePipeline,也称为中间操作。如果熟悉建造模式,其实关键点是build方法,因为它开始了整个流程。在stream里面也一样,中间操作只是记录了将要对集合进行的操作,至于什么时候开始是由结束操作(TerminalOp)来决定的.
这里我们以collect()方法为例说明.
我们以非并发为例说明。
ReduceOps.makeRef(collector)是生成一个结束操作(TerminalOp)。
然后我们回到AbstractPipeline.evaluate方法。
在这里我们可以看到调用的其实是TerminalOp.evaluateSequential方法
然后回头看看TerminalOp.evaluateSequential的具体操作
调用的是PipelineHelper.wrapAndCopyInto方法.
我们从ReferencePipeline可以看到ReferencePipeline继承了PipelineHelper类。所以helper.wrapAndCopyInto(makeSink(), spliterator).get()调用的是ReferencePipeline类(具体来说是AbstractPipeline)的wrapAndCopyInto方法.
然后来看下wrapsink包装sink(装饰器模式)。意思就是把之前中间操作和结束操作通过链表的方式连接起来
然后我们回到copyinto方法.
copyinto方法就是遍历spliterator的值,然后执行ReferencePipeline和TerminalOp设定的操作。最后通过TerminalOp设定的操作收集数据。