Java:聚合操作

时间:2016-02-20 13:28:27

标签: java lambda java-stream functional-interface

我正在研究泛型,函数接口,lambda表达式和聚合操作。虽然我个别理解这些技术,但我无法集体概念化它们,即它们如何协同工作。

使用来自Java Doc的示例:接口收集器(T,A,R)

Collector(Widget,?,TreeSet(Widget)) into = Collector.of(TreeSet::new, TreeSet::add, (left,right)->{left.addAll(right); return left;});

上述方法,在前面提到的javadoc中,具有以下行为参数:

Supplier(A) supplier,
BiConsumer(A,T) accumulator,
BiConsumer(A) combiner

上例中提供的供应商使用方法参考:TreeSet::new

用作结果供应商的TreeSet::new与累加器的关系是什么?与组合器的关系是什么?

这是如何工作的,我不明白这是一个供应商!?

关于这一广泛主题的任何文献链接都值得金银奖励。 谢谢你的耐心等待。

1 个答案:

答案 0 :(得分:0)

直接来自Java documentation

供应商:

  

创建并返回新的可变结果容器的函数。

TreeSet::new只是对TreeSet构造函数的调用,它返回TreeSet的一个实例。从这个意义上讲,它是TreeSet的供应商。

BiConsumer,在此上下文中称为累加器,代表

  

将值折叠到可变结果容器中的函数。

它将为类型A的对象提供类型为T的对象。通常,您只需调用集合的某个add方法,但在定义自定义收集器时也可以在此处进行一些预处理。 / p>

最后,BiConsumer被描述为:

  

接受两个部分结果并合并它们的函数。

在并行执行流程时使用它,并且需要将部分结果(在此上下文中,仅包含元素子集的TreeSet个对象)组合到最终TreeSet结果中。这通常是addAll方法。

因此,通过提供这些必要的成分,您就可以构建自己的收集机制。