【问题标题】:What is the use of a combiner in collect function of stream? [duplicate]流的收集功能中组合器的用途是什么? [复制]
【发布时间】:2019-07-14 02:58:40
【问题描述】:

在jdk8中,Stream提供collect函数supplier,accumulatorcombiner

<R> R collect(Supplier<R> supplier,BiConsumer<R, ? super T> accumulator,BiConsumer<R, R> combiner);

我在注解中看到了将String Stream转换为String的示例,但是我很困惑在函数签名中使用combiner。我认为在累加器中,新元素已添加到结果容器中?

我试过给组合器一个空值,但是我得到一个空指针异常。

 Stream<String> stringStream = Stream.of("hello", "world", "morning");
 String string = stringStream.collect(StringBuilder::new, 
 StringBuilder::append, StringBuilder::append).toString();
 System.out.println(string);

【问题讨论】:

  • supplier + accumulator 对于顺序收集是必需的。 combiner 用于并行收集。它对于顺序流是可选的。如果您不想提供它,您可以抛出类似(a,b)-&gt;{throw new RuntimeException();} 的 RuntimeException。您不能抛出常规的未经检查的异常。您不能将其设置为 null(这也让我感到困惑)
  • Javadoc 解释了您收到 NPE 的原因,目标是收集可以在顺序流和并行流之间互换而没有问题&lt;p&gt;Like {@link #reduce(Object, BinaryOperator)}, {@code collect} operations * can be parallelized without requiring additional synchronization.

标签: java java-8 java-stream


【解决方案1】:

Combiner :Combiner 工作在并行处理中,将两个与累加器兼容的值组合起来

collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner)

supplier : 它创建一个新的结果容器,该容器将由累加器和组合器填充,最后将由collect() 方法返回。在并行处理中,Supplier 函数将被多次调用,每次都会返回新值。

累加器:它将附加元素合并到结果中。

combiner : 它结合了必须与累加器兼容的两个值。组合器以并行处理方式工作。

List<String> list = Arrays.asList("Mukesh", "Vishal", "Amar");
    String result = list.parallelStream().collect(StringBuilder::new,
            (response, element) -> response.append(" ").append(element),
            (response1, response2) -> response1.append(",").append(response2.toString()))
            .toString();
    System.out.println("Result: " + result);

输出:

Result:  Mukesh, Vishal, Amar 

如果我们使用list.stream(),那么输出会有所不同,因为它不是并行处理,所以没有什么可以组合的。

输出:

Result:  Mukesh Vishal Amar 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-26
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2014-01-15
    • 2017-02-19
    • 1970-01-01
    相关资源
    最近更新 更多