考虑下面的代码,我们获取列表的 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/