Kotlin方法引用代替lambda

时间:2018-04-23 14:08:54

标签: methods kotlin

考虑以下代码,我们从中获取列表块,将它们连接起来并打印到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:类型推断失败:好玩   Iterable.chunked(size:Int,transform:(List) - > R):List   不能应用于接收器:列表参数:   (Int,KFunction6< @ParameterName CharSequence,@ ParameterName   CharSequence,@ ParameterName CharSequence,@ ParameterName Int,   @ParameterName CharSequence,@ ParameterName(name =" transform")   ((String) - > CharSequence)?,String>)

     

错误:(4,18)Kotlin:类型不匹配:推断类型是   KFunction6< @ParameterName CharSequence,@ ParameterName CharSequence,   @ParameterName CharSequence,@ ParameterName Int,@ ParameterName   CharSequence,@ ParameterName(name =" transform")((String) - >   CharSequence)?, String>但是(列表) - > ???预计

     

错误:(4,21)Kotlin:类型推断失败:好玩   Iterable.joinToString(separator:CharSequence = ...,前缀:   CharSequence = ...,后缀:CharSequence = ...,限制:Int = ...,   截断:CharSequence = ...,transform:((T) - > CharSequence)? =   ...):String不能应用于receiver:List参数:   ()

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

1 个答案:

答案 0 :(得分:4)

Kotlin问题跟踪器中有an open feature request标题为"支持函数引用,默认值为其他函数类型" ,似乎是你的用例缺少什么工作。

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

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