【发布时间】:2019-07-14 02:58:40
【问题描述】:
在jdk8中,Stream提供collect函数supplier,accumulator和combiner
<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)->{throw new RuntimeException();}的 RuntimeException。您不能抛出常规的未经检查的异常。您不能将其设置为 null(这也让我感到困惑) -
Javadoc 解释了您收到 NPE 的原因,目标是收集可以在顺序流和并行流之间互换而没有问题
<p>Like {@link #reduce(Object, BinaryOperator)}, {@code collect} operations * can be parallelized without requiring additional synchronization.
标签: java java-8 java-stream