我正在研究泛型,函数接口,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
与累加器的关系是什么?与组合器的关系是什么?
这是如何工作的,我不明白这是一个供应商!?
关于这一广泛主题的任何文献链接都值得金银奖励。 谢谢你的耐心等待。
答案 0 :(得分:0)
直接来自Java documentation:
供应商:
创建并返回新的可变结果容器的函数。
TreeSet::new
只是对TreeSet构造函数的调用,它返回TreeSet的一个实例。从这个意义上讲,它是TreeSet的供应商。
BiConsumer,在此上下文中称为累加器,代表
将值折叠到可变结果容器中的函数。
它将为类型A的对象提供类型为T的对象。通常,您只需调用集合的某个add
方法,但在定义自定义收集器时也可以在此处进行一些预处理。 / p>
最后,BiConsumer被描述为:
接受两个部分结果并合并它们的函数。
在并行执行流程时使用它,并且需要将部分结果(在此上下文中,仅包含元素子集的TreeSet
个对象)组合到最终TreeSet
结果中。这通常是addAll
方法。
因此,通过提供这些必要的成分,您就可以构建自己的收集机制。