【问题标题】:Java: Aggregate OperationsJava:聚合操作
【发布时间】:2016-02-20 13:28:26
【问题描述】:

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

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

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

任何与这一广泛主题相关的文档链接都价值不菲。 感谢您的耐心等待。

【问题讨论】:

  • 我是该网站的新手,正在学习其中的来龙去脉。看来您已经编辑了我的问题。是这样吗?如果是的话,谢谢

标签: java lambda java-stream functional-interface


【解决方案1】:

直接引用Java documentation

供应商:

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

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

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

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

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

最后,BiConsumer 被描述为:

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

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

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

【讨论】:

  • 谢谢鲍里斯,你对每个功能的解释是我需要阅读的。您帮助我对这些技术有了更深入的了解。
猜你喜欢
  • 1970-01-01
  • 2018-04-17
  • 2013-01-06
  • 2015-08-26
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多