0

我正在研究泛型、函数式接口、lambda 表达式和聚合操作。尽管我单独理解这些技术,但我无法将它们统一概念化,即它们如何协同工作。

使用取自 Java Doc 的示例,标题为:interface Collector(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用作结果提供者的 与累加器的关系是什么?...与组合器的关系是什么?

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

任何有关这一广泛主题的文档链接都将价值不菲。谢谢你的耐心。

4

1 回答 1

0

直接从Java 文档中引用:

供应商:

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

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

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

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

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

最后 BiConsumer 被描述为:

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

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

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

于 2016-02-20T13:49:52.917 回答