===== 函数介绍 ===== * 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也是链式调用的