Почему новый класс JDK8 Stream
содержит только следующие методы reduce
:
T reduce(BinaryOperator<T> reducer)
T reduce(T identity, BinaryOperator<T> reducer)
U reduce(U identity, BiFunction<U, ? super T, U> reducer,
BinaryOperator<U> combiner)
но не очевидный метод, который соответствует функциям reduce
/fold
, найденным на других языках (например, Haskell foldl :: (a -> b -> a) -> a -> [b] -> a
) и который может выглядеть следующим образом:
U reduce(U identity, BiFunction<U, ? super T, U> reducer)
?
Вместо этого существует аналогичный метод с дополнительным аргументом combiner
. Я даже не уверен, как его использовать, поскольку документация API, связанная с выше, не использует этот аргумент в этом примере, она только упоминает его требуемые свойства.
Почему методы JDK8 сделаны так и как я могу имитировать стандартное поведение fold
с ними?