Kotlin折叠功能是否需要类型转换或指定lambda类型?

时间:2020-03-18 04:43:16

标签: kotlin types casting fold

我正在查看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

1 个答案:

答案 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 })

所以initiallistOf<String>(),而operation{ acc, e -> if (e.length % 2 == 0) acc + e else acc }。需要在String中指定listOf<String>()的原因是,它有助于编译器确定RList<String>,然后知道{{1 }}。

如果我删除了该代码段,它将中断。

如果您要删除{ acc, e -> ... },则只剩下一个参数,而(listOf<String>())需要两个参数。

Kotlin折叠功能是否需要类型转换或指定lambda类型?

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

相关问题