当前位置: 首页 > 面试题库 >

在何处定义collect的组合器(供应商,累加器,组合器)的组合顺序?

柳珂
2023-03-14
问题内容

Java API文档指出combinercollect方法的参数必须为:

用于组合两个值的关联,无干扰,无状态函数,必须与累加器函数兼容

A combiner是一个a
BiConsumer<R,R>,它接收两个type类型的参数R返回void。但是文档没有说明我们是否应该将元素组合到第一个或第二个参数中?

例如,以下示例可能会根据组合be的顺序给出不同的结果: m1.addAll(m2)m2.addAll(m1)

List<String> res = LongStream
     .rangeClosed(1, 1_000_000)
     .parallel()
     .mapToObj(n -> "" + n)
     .collect(ArrayList::new, ArrayList::add,(m1, m2) -> m1.addAll(m2));

我知道在这种情况下,我们可以简单地使用方法句柄,例如ArrayList::addAll。但是,在某些情况下,需要Lambda,并且必须按正确的顺序组合项目,否则在并行处理时可能会得到不一致的结果。

Java 8 API文档的任何部分都声明了这一点?还是真的没关系?


问题答案:

似乎在文档中没有明确说明。但是,流API中有一个订购概念。流可以订购,也可以不订购。如果源分隔符无序(例如,如果流源为HashSet),则可能从一开始就无序。否则,如果用户明确使用unordered()操作,则流可能变得无序。如果流是有序的,那么收集过程也应该是稳定的,因此,我想,
假设 对于有序流combiner,它们按严格顺序接收参数。但是,不能保证无序流。



 类似资料:
  • JavaAPI文档声明方法的参数必须是: 用于组合两个值的关联、非干扰、无状态函数,必须与累加器函数兼容 合路器是双余弦 例如,根据组合顺序,以下示例可能给出不同的结果:或m2。addAll(m1)。 我知道,在这种情况下,我们可以简单地使用方法句柄,例如ArrayList::addAll。然而,在某些情况下,需要Lambda,我们必须按正确的顺序组合项目,否则在并行处理时可能会得到不一致的结果。

  • 问题内容: 我不了解以下方法的第三个参数的实用程序: 从javaDoc: 产生的结果等于: 如您所见,该参数未使用。例如,以下代码将字符串累积到ArrayList中: 但我期望这样: 问题答案: 在使用时,你的是平行的,因为在这种情况下,多个线程收集的元素到最终输出的子列表,并且这些子列表必须被组合以产生最终的。

  • 我不明白以下方法的第三个参数的效用: 来自Javadoc: 如您所见,没有使用参数。例如,以下内容将把字符串累加到ArrayList中: 但我预料到了这一点:

  • 不知何故,我对replaceFunction部分感到困惑,但让我根据我的理解分解它。 行将创建.的流 我正在使用的方法接受标识、累加器和组合器。 因为我没有使用并行流,所以我想省略合并器,但是编译器抛出了一个错误。有什么方法可以将这个累加器转换成? 将始终返回一个返回输入参数的函数。在这种情况下,类型为 第二个论点是我搞不懂的东西之一。. function::andthen在此过程中做什么? 最后

  • 我发现在Hyperledger composer playground中,任何人都可以删除当前的商业网络。我如何限制它,使只有管理员可以删除他们自己的业务网络?

  • 本文向大家介绍jQuery 组合选择器,包括了jQuery 组合选择器的使用技巧和注意事项,需要的朋友参考一下 示例 考虑以下DOM结构 后代和子选择器 给定父母<ul>-parentUl找到其后代(<li>), 简单 $('parent child') >> $('ul.parentUl li') 这样可以将指定祖先的所有匹配后代降低到所有级别。 > -- $('parent > child')