我不明白以下方法的第三个参数的效用:
<R> R collect(Supplier<R> supplier,
BiConsumer<R,? super T> accumulator,
BiConsumer<R,R> combiner)
来自Javadoc:
R result = supplier.get();
for (T element : this stream)
accumulator.accept(result, element);
return result;
如您所见,没有使用参数Combiner
。例如,以下内容将把字符串累加到ArrayList中:
List<String> asList = stringStream.collect(ArrayList::new, ArrayList::add,
ArrayList::addAll);
但我预料到了这一点:
List<String> asList = stringStream.collect(ArrayList::new, ArrayList::add );
当您的流
并行时使用组合器
,因为在这种情况下,几个线程将流
的元素收集到最终输出ArrayList
的子列表中,这些子列表必须组合以生成最终的ArrayList
。
问题内容: 我不了解以下方法的第三个参数的实用程序: 从javaDoc: 产生的结果等于: 如您所见,该参数未使用。例如,以下代码将字符串累积到ArrayList中: 但我期望这样: 问题答案: 在使用时,你的是平行的,因为在这种情况下,多个线程收集的元素到最终输出的子列表,并且这些子列表必须被组合以产生最终的。
JavaAPI文档声明方法的参数必须是: 用于组合两个值的关联、非干扰、无状态函数,必须与累加器函数兼容 合路器是双余弦 例如,根据组合顺序,以下示例可能给出不同的结果:或m2。addAll(m1)。 我知道,在这种情况下,我们可以简单地使用方法句柄,例如ArrayList::addAll。然而,在某些情况下,需要Lambda,我们必须按正确的顺序组合项目,否则在并行处理时可能会得到不一致的结果。
问题内容: Java API文档指出该方法的参数必须为: 用于组合两个值的关联,无干扰,无状态函数,必须与累加器函数兼容 A 是一个a ,它接收两个type类型的参数并返回。但是文档没有说明我们是否应该将元素组合到第一个或第二个参数中? 例如,以下示例可能会根据组合be的顺序给出不同的结果: 或。 我知道在这种情况下,我们可以简单地使用方法句柄,例如。但是,在某些情况下,需要Lambda,并且必须
假设我试图创建一个收集器,将数据聚合到一个资源中,该资源在使用后必须关闭。有没有办法实现类似于
为什么并行流使用合并器类,而顺序流将使用累加器?为什么并行流不使用累加器? 以下是上述代码的输出: 那么,为什么顺序流使用累加器,并行流使用组合器?并行流不能使用累加器吗?
示例程序: 所以,为了简化这里的问题,没有最终的转换,所以得到的代码非常简单。