methods - Kotlin 方法引用代替 lambda

标签 methods kotlin

考虑下面的代码,我们获取列表的 block ,将它们连接起来并打印到标准输出:

val l = listOf("1", "2", "3", "4", "5", "6", "7")
l.chunked(3, { a -> a.joinToString()}).forEach(::println)

代码运行没有问题。我想将 lambda 调用 ({ a -> a.joinToString()}) 更改为方法引用,如下所示:

l.chunked(3, l::joinToString).forEach(::println)

使用方法引用的代码无法编译,给出的错误是:

Error:(4, 7) Kotlin: Type inference failed: fun Iterable.chunked(size: Int, transform: (List) -> R): List cannot be applied to receiver: List arguments: (Int,KFunction6<@ParameterName CharSequence, @ParameterName CharSequence, @ParameterName CharSequence, @ParameterName Int, @ParameterName CharSequence, @ParameterName(name = "transform") ((String) -> CharSequence)?, String>)

Error:(4, 18) Kotlin: Type mismatch: inferred type is KFunction6<@ParameterName CharSequence, @ParameterName CharSequence, @ParameterName CharSequence, @ParameterName Int, @ParameterName CharSequence, @ParameterName(name = "transform") ((String) -> CharSequence)?, String> but (List) -> ??? was expected

Error:(4, 21) Kotlin: Type inference failed: fun Iterable.joinToString(separator: CharSequence = ..., prefix: CharSequence = ..., postfix: CharSequence = ..., limit: Int = ..., truncated: CharSequence = ..., transform: ((T) -> CharSequence)? = ...): String cannot be applied to receiver: List arguments: ()

有没有办法用方法引用而不是 lambda 调用来编译代码?我开始学习 Kotlin,但假设错误源于 joinToString 使用许多默认参数这一事实?

最佳答案

an open feature request在 Kotlin 问题跟踪器中,标题为“支持使用默认值作为其他函数类型的函数引用”,这似乎是您的用例缺少的内容。

该功能当前的目标版本为 1.3。

更新 1.3 Kotlin 版本不包含此功能,目标版本更新为 1.4

关于methods - Kotlin 方法引用代替 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49983251/

相关文章:

java - 在Java中获取返回类型的注解

inheritance - 如何对数据类使用简单继承?

kotlin - Kotlin Coroutine 的 block.startCoroutine() 是如何工作的?

android - by viewModels 由于接收器类型不匹配,以下候选者均不适用

java - 代码运行但没有给我正确的输出

java - 在Java中打印矩阵行

ios - 找到多个名为 "setLength"的方法

c - 单元测试 stub C 辅助方法

java - 为什么 kotlin 中的属性覆盖使主构造函数属性为零

java - 如何从java测试代码访问内部属性