Stream原理与执行流程探析
阿里妹导读
List<String> startlist = Lists.newArrayList("a","b","c");List<String> endList = startlist.stream().map(r->r+"b").filter(r->r.startsWith("a")).collect(Collectors.toList());
流的三大特点
1.流并不存储元素。这些元素可能存储在底层的集合中,或者是按需生成。
2.流的操作不会修改其数据元素,而是生成一个新的流。
3.流的操作是尽可能惰性执行的。这意味着直至需要其结果时,操作才会执行。
流的运行流程
整体类图介绍
表1:Stream操作分类
搭建流水线
1.创建一个流,如通过stream()产生Head,Head就是初始流,数据存储在Spliterator。
2.将初始流转换成其他流的中间操作,可能包含多个步骤,比如上面map与filter操作。
定义输入源HEAD
stream()运行结果
Stream<String> headStream =startlist.stream();stream()源码分析
StreamSupport.stream()返回了ReferencPipeline$Head类。
定义流水线中间节点
Map
map()运行结果
Stream<String> mapStream =startlist.stream().map(r->r+"b");map()源码分析
Filter
filter()运行结果
Stream<String> filterStream =startlist.stream().map(r->r+"b").filter(r->r.startsWith("a"));Filter阶段的depth再次+1,sourceStage指向Head,predict指向代码块:
filter()源码分析
定义终结操作
collect()运行结果
List<String> endList = startlist.stream().map(r->r+"b").filter(r->r.startsWith("a")).collect(Collectors.toList());collect()源码分析
反向回溯生成操作实例
启动流水线
总结