我正在查看Kotlin折叠功能的文档,并且在理解发生的事情时有些困难。他们提供的示例如下:
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]}
他们说应该只有一个“操作函数”作为参数。
.fold(listOf<String>()) { acc, e -> if (e.length % 2 == 0) acc + e else acc }
但是,除了lambda之外,它们还具有(listOf<String>())
部分。虽然某些函数调用的参数周围缺少括号有时使我感到困惑,但我认为这不可能完全是一个函数调用。 Kotlin折叠功能是否需要类型转换或指定lambda类型?如果我删除了该代码段,它将中断。我非常确定,指定类型的唯一方法是带有返回类型而不是lambda的匿名函数,因此我真的不太确定这是怎么回事。我是Kotlin的新手,所以请您对这种语法的含义以及fold函数的工作方式进行任何解释。
以下是文档的链接:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/fold.html
答案 0 :(得分: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 })
所以initial
是listOf<String>()
,而operation
是{ acc, e -> if (e.length % 2 == 0) acc + e else acc }
。需要在String
中指定listOf<String>()
的原因是,它有助于编译器确定R
是List<String>
,然后知道{{1 }}。
如果我删除了该代码段,它将中断。
如果您要删除{ acc, e -> ... }
,则只剩下一个参数,而(listOf<String>())
需要两个参数。
Kotlin折叠功能是否需要类型转换或指定lambda类型?
好吧,示例中没有类型转换或指定lambda类型,所以没有。