【问题标题】:About collect (supplier, accumulator, combiner) [duplicate]关于收集(供应商,累加器,合并器)[重复]
【发布时间】:2015-07-21 07:55:22
【问题描述】:

不明白下面方法的第三个参数的用处:

<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 );

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    combiner 在您的Stream 是并行的时使用,因为在这种情况下,多个线程将Stream 的元素收集到最终输出ArrayList 的子列表中,并且这些子列表必须是合并产生最终的ArrayList

    【讨论】:

    • 如果并行处理,则合并后的结果将无法保证原始流的顺序。对吗?
    • @Chen 我相信这取决于传递给collect 的组合器。组合器可以保持原来的顺序。
    • @Chen 你是对的。订单不会得到保证。组合器的假设是,组合器操作应该是关联的,例如a+(b+c) = (a+b)+c
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 2020-04-12
    相关资源
    最近更新 更多