为什么Stream ::中的累加器减少BiFunction而不是像组合器那样的BinaryOperator?

Ahm*_* M. 5 java reduce java-8 java-stream functional-interface

为什么方法中的累加器参数是Stream::reducea BiFunction而不是BinaryOperator像combiner参数一样.

为什么是它的类型 BiFunction<U, ? super T, U>?为什么T?应该是BiFunction<U, ? extends U, U>吗?

Era*_*ran 7

<U> U reduce(U identity,
             BiFunction<U, ? super T, U> accumulator,
             BinaryOperator<U> combiner);
Run Code Online (Sandbox Code Playgroud)

累加器是添加的元素的函数Stream(其类型由表示T)连接到的中间结果reduce的操作(其类型由表示U),并返回更新的结果(也类型的U).

因此,您无法将其定义为a BinaryOperator,其中操作数和结果都是相同类型.

例如,您可以在调用a中作为累加器传递,该reduce调用BiFunction<Integer,String,Integer>应用于a Stream<String>并生成所有元素的长度之和.你不能使用a BinaryOperator<Integer>或a BinaryOperator<String>.

另一方面,组合器获取两个中间结果(两者都是相同类型U)并将它们合并到类型也是的结果中U.因此BinaryOperator<U>,BiFunction<U,U,U>可以使用(延伸).

  • @AhmadMoawad这是我在答案中提到的方法签名. (2认同)