我知道的其他技术(.Net、JS)包含最简单的折叠/归约操作:
TResult reduce(TResult result, (TResult prevResult, TValue value) -> TResult)
我发现的一种方法要求 TValue 和 TResult 为同一类型。
另一种需要提供结合 2 个 TResult 的 BinaryOperation。
这些限制都不符合我的背景。
现在我最终得到了这样的代码:
Accumulator acc = someInitialValue;
for(Element element: list) {
accumulator = reducer(accumulator, element);
}
但我相信基本方法应该包含在流 API 中。
我也找过收藏家,但没有发现任何有用的东西。
您正在寻找的是 Java 8 中添加的 Java Stream 框架。
The Stream https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html班级有3个reduce
方法:
- Optional<T> reduce(BinaryOperator<T> accumulator) https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#reduce-java.util.function.BinaryOperator-
- T reduce(T identity, BinaryOperator<T> accumulator) https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#reduce-T-java.util.function.BinaryOperator-
- <U> U reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner) https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#reduce-U-java.util.function.BiFunction-java.util.function.BinaryOperator-
第二reduce
方法与您的示例匹配,但需要相同的结果类型。对于不同的结果类型,需要使用第三种reduce
方法,这需要额外的combiner
方法,因为它需要支持并行处理。
它还拥有 2collect
方法:
- <R,A> R collect(Collector<? super T,A,R> collector) https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#collect-java.util.stream.Collector-
- <R> R collect(Supplier<R> supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner) https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#collect-java.util.function.Supplier-java.util.function.BiConsumer-java.util.function.BiConsumer-
首先collect
方法是最常用的一种,与Collectors https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html工厂类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)