您是正确的,合并操作的功能签名(同样适用于reduce)不需要像BinaryOperator这样的接口.
这不仅可以通过以下事实来说明:toMap收集器的mergeFunction最终将在Map.merge处接受BiFunction您也可以将这样的BiFunction转换为所需的BinaryOperator:
BiFunction
MULTIPLY_DOUBLES = (a,b) -> a.doubleValue() * b.doubleValue();
Stream s = Stream.of(42.0,0.815);
Optional n=s.reduce(MULTIPLY_DOUBLES::apply);
或完全通用:
public static Optional reduce(
Stream s,BiFunction super T,? super T,? extends T> f) {
return s.reduce(f::apply);
}
创建BinaryOperator和UnaryOperator的最有可能的原因是与这些没有这样的超级接口的这些函数的原始类型版本对称.
在这方面,方法是一致的
Stream.reduce(BinaryOperator< T)
> IntStream.reduce(IntBinaryOperator)
> DoubleStream.reduce(DoubleBinaryOperator)
> LongStream.reduce(LongBinaryOperator)
要么
> Arrays.parallelPrefix(T [] array,BinaryOperator< T> op)> Arrays.parallelPrefix(int [] array,IntBinaryOperator op)> Arrays.parallelPrefix(double [] array,DoubleBinaryOperator op)> Arrays.parallelPrefix(long [] array,LongBinaryOperator op)