首页 文章

Kotlin方法参考代替lambda

提问于
浏览
0

考虑以下代码,我们在其中获取列表的块,连接它们并打印到stdout:

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)

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

错误:(4,7)Kotlin:类型推断失败:fun Iterable.chunked(size:Int,transform:(List) - > R):List不能应用于receiver:List arguments:(Int,KFunction6 <@ParameterName CharSequence,@ ParameterName CharSequence,@ ParameterName CharSequence,@ ParameterName Int,@ ParameterName CharSequence,@ ParameterName(name =“transform”)((String) - > CharSequence)?, String>)错误:(4,18)Kotlin:Type不匹配:推断类型是KFunction6 <@ParameterName CharSequence,@ ParameterName CharSequence,@ ParameterName CharSequence,@ ParameterName Int,@ ParameterName CharSequence,@ ParameterName(name =“transform”)((String) - > CharSequence)?, String> but(列表) - > ???预计错误:(4,21)Kotlin:类型推断失败:有趣的Iterable.joinToString(分隔符:CharSequence = ...,前缀:CharSequence = ...,后缀:CharSequence = ...,限制:Int = .. . ,truncated:CharSequence = ...,transform:((T) - > CharSequence)?= ...):String不能应用于receiver:List arguments :()

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

1 回答

  • 2

    在Kotlin问题跟踪器中有an open feature request, Headers 为"Support function references with default values as other function types",这似乎是您的用例无法工作的原因 .

    该功能目前的目标版本为1.3 .

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

相关问题