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

问题描述 投票:0回答:1

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

kotlin types casting fold
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 }

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

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

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

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

需要在String中指定listOf<String>()的原因是,它有助于编译器确定RList<String>,然后知道{ acc, e -> ... }中两个参数的类型。

© www.soinside.com 2019 - 2024. All rights reserved.