我正在查看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
在链接的文档中,您可以看到有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 }
。
如果我删除该代码段,它将中断。
如果您的意思是仅删除(listOf<String>())
,那么您剩下一个参数,而fold
需要两个参数。
Kotlin折叠功能是否需要类型转换或指定lambda类型?
好,示例中没有类型转换或指定lambda类型,所以没有。
需要在String
中指定listOf<String>()
的原因是,它有助于编译器确定R
为List<String>
,然后知道{ acc, e -> ... }
中两个参数的类型。