===== 函数介绍 =====
* Supplier(void) -> (a)
* Function(a) -> (b)
* BiFunction(a,b) -> ( c )
* BinaryOperator 继承于 BiFunction。但是3个变量类型相同
* Consumer (a) -> (void)
* BiConsumer (a,b) -> (void)
* Predicate (a) -> (boolean)
* BiPredicate (a,b) -> (boolean)
使用方式上,函数和匿名类差不多,但是他们是有本质区别的。 函数是没有内存空间的,所以没有属性的概念
===== stream =====
* BaseStream : 遍历、拆分、打开、关闭、并行、串行
* Stream extend BaseStream: map、filter、reduce、count
* AbstractPipeline extend Stream:流的功能实现,将流通过双向链表串联起来
* ReferencePipeline:流的功能实现,并提供子类实现
* ReferencePipeline.Head extends ReferencePipeline: 代表流的开始(只有一个)
* ReferencePipeline.StatelessOp extends ReferencePipeline: 代表流的中间阶段(可能多个)
* 其他关键类
* Spliterator:数据数据集的抽象,存储了流的初始数据,并提供了遍历功能
* Sink:代表流中间过程,每个阶段的处理函数。 map、filter
* TerminalSink: 代表流最后的一个步骤。count、sum、findFirst
===== 执行流程 =====
- Stream.of(1,2,3).map(a->a*10).filter(a->a >20).count()
- 第一步生成stream链
- {{:pasted:20181107-211714.png}}
- 第二部,构建函数链
- {{:pasted:20181107-212214.png}}
- 第三步: 将每个数据依次调用方法链
- 如果没有短路操作,如:count、sum
- 执行方式:spliterator.forEachRemaining(方法链)
- 如果有短路操作, 如:findFirst
- 执行方式:while (!方法链.cancellationRequested() && spliterator.tryAdvance(方法链))
- 一般短路方法(如:findFirst)会实现cancellationRequested()函数,cancellationRequested也是链式调用的