kotlin - 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
解决方案
在链接的文档中,您可以看到有 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 }
的原因是它可以帮助编译器找出它,然后它知道.String
listOf<String>()
R
List<String>
{ acc, e -> ... }
如果我摆脱了那个代码片段,它就会中断。
如果您的意思是仅删除(listOf<String>())
,那么您只剩下一个参数,并且fold
需要两个参数。
Kotlin 折叠函数是否需要类型转换或指定 lambda 类型?
好吧,示例中没有类型转换或指定 lambda 类型,所以它没有。
推荐阅读
- windows - 为什么更改主机文件中的主机名不会更改我的计算机名称?
- javascript - 单击“搜索”按钮后如何使搜索栏呈现更改?
- php - 导出为 CSV 时如何更改数组的顺序?
- html - 如何让我的搜索栏搜索我的其他页面
- performance - Unity:将游戏设置为动画帧速率,为什么不呢?
- sql - SQL 服务器查询到 oracle 的转换
- data-analysis - Orange3中的Jittering是什么意思?它有什么功能?
- python - 使用 04-zoo.csv 数据进行二进制分类
- azure - 如何解决部署问题?将实体框架核心从 3.1.4 升级到 3.1.5。结果 mvc 核心 Web 应用在 VS 中运行,但在 Azure 中失败
- java - 禁用 Spring Web 客户端的 SSL 检查