在java.util.stream.Stream接口的两个收集方法中,其中一个构造不良?

boo*_*lan 9 java java-8 java-stream collectors

在java.util.stream.Stream接口中,

<R> R collect(Supplier<R> supplier,
              BiConsumer<R, ? super T> accumulator,
              BiConsumer<R, R> combiner);
Run Code Online (Sandbox Code Playgroud)

组合器是a BiConsumer<R, R>,而在

<R, A> R collect(Collector<? super T, A, R> collector);
Run Code Online (Sandbox Code Playgroud)

组合器是一个BinaryOperator<A>只是一个BiFunction<A,A,A>.

虽然后面的形式清楚地定义了组合后组合对象的参考,但前一种形式却没有.

那么任何Stream实现库如何知道,前一种情况下的组合对象是什么?

Fed*_*ner 8

在Java 9中,该Stream.collect(Supplier, BiConsumer, BiConsumer)方法的文档已经更新,现在它明确提到您应该将第二个结果容器中的元素折叠到第一个容器中:

combiner - 一个关联的,非干扰的无状态函数,它接受两个部分结果容器并合并它们,它们必须与累加器函数兼容.组合器函数必须将元素从第二个结果容器折叠到第一个结果容器中.

(强调我的).