用户工具


函数介绍

  • 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

执行流程

  1. Stream.of(1,2,3).map(a→a*10).filter(a→a >20).count()
  2. 第一步生成stream链
  3. 第二部,构建函数链
  4. 第三步: 将每个数据依次调用方法链
    1. 如果没有短路操作,如:count、sum
      1. 执行方式:spliterator.forEachRemaining(方法链)
    2. 如果有短路操作, 如:findFirst
      1. 执行方式:while (!方法链.cancellationRequested() && spliterator.tryAdvance(方法链))
      2. 一般短路方法(如:findFirst)会实现cancellationRequested()函数,cancellationRequested也是链式调用的