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

时间:2016-12-08 09:32:18

标签: java java-8 java-stream reduce functional-interface

为什么Stream::reduce方法中的累加器参数为BiFunction而不是BinaryOperator,如组合器参数。

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

1 个答案:

答案 0 :(得分:7)

<U> U reduce(U identity,
             BiFunction<U, ? super T, U> accumulator,
             BinaryOperator<U> combiner);

累加器是一个函数,它将Stream的元素(其类型由T表示)添加到reduce操作的中间结果中(其类型由U表示)并返回更新的结果(同样类型为U)。

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

例如,您可以在reduce调用BiFunction<Integer,String,Integer>中作为累加器传递,该Stream<String>应用于BinaryOperator<Integer>并生成长度之和所有元素。您无法使用BinaryOperator<String>U

另一方面,组合器获取两个中间结果(两者都是相同类型U)并将它们合并到类型也为BinaryOperator<U>的结果中。因此,可以使用BiFunction<U,U,U>(扩展suits = ['Hearts','Clubs','Diamonds','Spades']#list of suits cards = ['Ace','2','3','4','5','6','7','8','9','10','Jack','Queen','King'] vals = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10] )。