首页 > 解决方案 > Kotlin 折叠函数是否需要类型转换或指定 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]}

他们说应该只有一个“操作函数”作为参数。

.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

标签: kotlintypescastingfold

解决方案


在链接的文档中,您可以看到有 2 个参数:

inline fun <T, R> Iterable<T>.fold(
    initial: R,
    operation: (acc: R, T) -> R
): R

通过尾随 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 }的原因是它可以帮助编译器找出它,然后它知道.StringlistOf<String>()RList<String>{ acc, e -> ... }

如果我摆脱了那个代码片段,它就会中断。

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

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

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


推荐阅读