Kotlin Fold Function 是否需要类型转换或指定 lambda 类型?

Does the Kotlin Fold Function require type casting or specifying lambda type?

我正在查看 Kotlin fold 函数的文档,但有点难以理解正在发生的事情。他们提供的例子如下:

val fruits = listOf("apple", "apricot", "banana", "blueberry", "cherry", "coconut")

// collect only even length Strings
val evenFruits = fruits.groupingBy { it.first() }
    .fold(listOf<String>()) { acc, e -> if (e.length % 2 == 0) acc + e else acc }

println(evenFruits) // {a=[], b=[banana], c=[cherry]}

他们说应该只有一个 "operation function" 作为参数。

.fold(listOf<String>()) { acc, e -> if (e.length % 2 == 0) acc + e else acc }

但是,除了lambda,它们还有(listOf<String>())部分。虽然某些函数调用的参数周围缺少括号有时让我感到困惑,但我想这不可能是一个单独的函数调用。 Kotlin fold Function 是否需要类型转换或指定 lambda 类型?如果我去掉那个代码片段,它就会崩溃。我很确定指定类型的唯一方法是使用 return 类型的匿名函数而不是 lambda,所以我真的不太确定这里发生了什么。我是 Kotlin 的新手,所以如果能解释一下此语法的含义以及折叠函数的工作原理,我将不胜感激。

这是文档的 link:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/fold.html

在链接文档中,您可以看到有 2 个参数:

inline fun <T, R> Iterable<T>.fold(
    initial: R,
    operation: (acc: R, T) -> R
): R

trailing lambda规则,调用是另一种写法

.fold(listOf<String>(), { acc, e -> if (e.length % 2 == 0) acc + e else acc })

所以 initiallistOf<String>()operation{ acc, e -> if (e.length % 2 == 0) acc + e else acc }String 需要在 listOf<String>() 中指定的原因是它帮助编译器弄清楚 RList<String> 然后它知道 [=20] 中两个参数的类型=].

If I get rid of that code snippet it breaks.

如果你的意思是只删除 (listOf<String>()) 那么你只剩下一个参数,而 fold 需要两个。

Does the Kotlin fold Function require typecasting or specifying lambda type?

好吧,示例中没有类型转换或指定 lambda 类型,所以它没有。