关于收集(供应商,累加器,合并器)

时间:2015-07-21 07:55:23

标签: java java-8 java-stream

我不明白以下方法的第三个参数的效用:

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

1 个答案:

答案 0 :(得分:14)

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