目录
函数介绍
stream
执行流程
函数介绍
Supplier
(void) → (a)
Function
(a) → (b)
BiFunction
(a,b) → ( c )
BinaryOperator
继承于 BiFunction<T,T,T>。但是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链
第二部,构建函数链
第三步: 将每个数据依次调用方法链
如果没有短路操作,如:count、sum
执行方式:spliterator.forEachRemaining(方法链)
如果有短路操作, 如:findFirst
执行方式:while (!方法链.cancellationRequested() && spliterator.tryAdvance(方法链))
一般短路方法(如:findFirst)会实现cancellationRequested()函数,cancellationRequested也是链式调用的