组合器在流的收集功能中有什么用?

时间:2019-07-14 02:58:40

标签: java java-8 java-stream

在jdk8中,流提供collectsupplieraccumulator的{​​{1}}函数

combiner

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

我曾尝试为组合器提供一个空值,但出现了一个空指针异常。

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

1 个答案:

答案 0 :(得分:2)

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

collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner)

供应商::它将创建一个新的结果容器,该容器将由累加器和组合器填充,最后将由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