Stream.reduce的累加器参数中通配符的用途是什么?

Ked*_*ade 3 java generics java-8

一种Java reduce方法Stream:

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

有助于根据流中对象的某些属性来减少流.

但是,我不清楚为什么accumulator不能更直接和服务于同一目的:

BiFunction<U, T, U> accumulator.

accumulator签名中的通配符提供了哪些额外的灵活性(以降低可读性为代价)?

Pet*_*rey 6

为什么累加器不能更直接并且服务于相同的目的:

它可能会比需要更具限制性.如果你说的话

BiFunction<String, Object, String> accumulator = (a,b) -> a + b;
Run Code Online (Sandbox Code Playgroud)

你应该能够把它传递给

String join = strings.stream().reduce("text: ", accumulator, (a, b) -> a + b);
Run Code Online (Sandbox Code Playgroud)

要么

String join = ints.stream().reduce("long num: ", accumulator, (a, b) -> a + b);
Run Code Online (Sandbox Code Playgroud)

即你可以为两个减少编写一个累加器.

  • @KedarMhaswade很难说,但从API设计师的角度来看,几乎可以肯定有一天,有一天会问,为什么我不能这样做,如果它限制为`<U,T,U> ` (2认同)