我知道的其他技术(.Net,JS)包含最简单的折叠/减少操作:
TResult reduce(TResult result, (TResult prevResult, TValue value) -> TResult)
我发现一个方法要求TValue和TResult为同一类型。 另一个要求提供结合2个TResults的BinaryOperation。 这些约束都不符合我的情况。 现在,我最终得到如下代码:
Accumulator acc = someInitialValue;
for(Element element: list) {
accumulator = reducer(accumulator, element);
}
但是我相信基本方法应该包含在流API中。
我也寻找过收藏家,但没有发现任何帮助。
答案 0 :(得分:4)
您正在寻找的是Java 8中添加的Java Stream框架。
Stream
类具有3个reduce
方法:
Optional<T> reduce(BinaryOperator<T> accumulator)
T reduce(T identity, BinaryOperator<T> accumulator)
<U> U reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)
第二个reduce
方法与您的示例匹配,但是需要相同的结果类型。对于不同的结果类型,您需要使用第三个reduce
方法,该方法需要额外的combiner
方法,因为它需要支持并行处理。
它也有2个collect
方法:
<R,A> R collect(Collector<? super T,A,R> collector)
<R> R collect(Supplier<R> supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner)
与Collectors
工厂类结合使用时,第一种collect
方法是最常用的方法。