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 })
所以 initial
是 listOf<String>()
而 operation
是 { acc, e -> if (e.length % 2 == 0) acc + e else acc }
。 String
需要在 listOf<String>()
中指定的原因是它帮助编译器弄清楚 R
是 List<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 类型,所以它没有。
我正在查看 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 })
所以 initial
是 listOf<String>()
而 operation
是 { acc, e -> if (e.length % 2 == 0) acc + e else acc }
。 String
需要在 listOf<String>()
中指定的原因是它帮助编译器弄清楚 R
是 List<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 类型,所以它没有。