为什么Stream::reduce
方法中的累加器参数为BiFunction
而不是BinaryOperator
,如组合器参数。
为什么类型为BiFunction<U, ? super T, U>
?为什么T
?它应该是BiFunction<U, ? extends U, U>
吗?
答案 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]
)。