Используется как BinaryOperator<T>
в вашем текущем контексте.
Эквивалентное лямбда-представление:
(bigDecimal, augend) -> bigDecimal.add(augend) // same as in your previous line of code
и анонимный класспредставление:
new BinaryOperator<BigDecimal>() {
@Override
public BigDecimal apply(BigDecimal bigDecimal, BigDecimal augend) {
return bigDecimal.add(augend);
}
}
, где BinaryOperator<T> extends BiFunction<T,T,T>
, что означает специализацию BiFunction
для случая, когда операнды и результат имеют один и тот же тип.
Кроме того, ваш код фактически использует одну из перегруженных реализаций метода reduce
, то есть Stream.reduce(T identity, BinaryOperator<T> accumulator)
.
Как может BigDecimal ::add будет использоваться в BiFunction
Просто на шаг дальше и только для объяснения , есть также перегруженная реализация, которая использует combiner
, как в Stream.reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)
который будет выглядеть так:
BigDecimal total = list.stream()
.reduce(BigDecimal.ZERO, BigDecimal::add, BigDecimal::add);
// ^^ ^^
// BiFunction here BinaryOperator here