【发布时间】:2020-10-23 18:42:41
【问题描述】:
此问题针对Vavr(Java 的 FP 库),但可能适用于 Scala 或其他可以与 Java 相媲美的 FP 语言。
VavrfoldLeft有什么区别:
-
<U> U foldLeft(U zero, BiFunction<? super U, ? super T, ? extends U> combiner)
还有 Java 的 collect:
-
<R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner)
似乎两者都可以达到相同的目的:通过遍历一个集合(比如Stream<T>)并在遍历时将结果累积为一个新类型U(或R)。
乍一看,#arguments 中的签名不同,Java collect 似乎打算在并行块中运行。
在概念上有哪些实际差异? Vavr foldLeft 似乎更易于使用。
非常愚蠢的例子只是为了说明:
VavrfoldLeft:
// result = "HelloFunctionalWorld"
String result = Seq("Hello", "Functional", "World")
.foldLeft(new StringBuilder(), (acc, word) -> acc.append(word))
.toString();
Javacollect:
// result = "HelloFunctionalWorld"
final String result = Arrays.asList("Hello", "Functional", "World").stream()
.collect(
StringBuilder::new,
(acc, word) -> acc.append(word),
StringBuilder::append
)
.toString();
【问题讨论】:
-
嗨@NathanHughes,我想我应该在问题中介绍Java
reduce操作,因为我看不出reduce和collect对于特别笨的人的区别例子。 -
对于它的价值,我认为阶乘在这里是一个更好的玩具示例,例如,scastie.scala-lang.org/ZxkWbgeRTaa0MbhrOGmG5Q
-
@user,有一个版本的
reduce缩减为不同的类型U,所以流的类型和缩减值的类型可以不同。它们不需要相同。
标签: java scala java-stream vavr