Kotlin中使用方法引用替代Lambda调用chunked方法时编译失败
为什么用
l::joinToString替换Lambda会编译失败? 咱们先把问题场景理清楚:
首先这段代码是能正常运行的,它把列表分块后拼接每个子列表并打印:
val l = listOf("1", "2", "3", "4", "5", "6", "7") l.chunked(3, { a -> a.joinToString() }).forEach(::println)
但把Lambda换成方法引用l::joinToString后,代码就编译报错了:
val l = listOf("1", "2", "3", "4", "5", "6", "7") l.chunked(3, l::joinToString).forEach(::println)
问题出在哪?
核心是函数类型不匹配:
chunked的第二个参数要求的是一个(List<T>) -> R类型的函数——简单说就是,这个函数要接收分出来的子列表作为参数,然后返回拼接后的字符串。- 你写的
l::joinToString是绑定了原列表l的方法引用,它的本质是“调用原列表l的joinToString方法”,不需要接收任何参数(因为接收者已经固定是l了),函数类型是() -> String,和chunked需要的类型完全不搭。
而原来的Lambda{ a -> a.joinToString() }是接收子列表a,然后调用这个子列表自身的joinToString,这才符合chunked的参数要求。
正确的方法引用写法
如果想用方法引用替代Lambda,应该引用List类的成员函数,而不是绑定到具体实例l的引用:
val l = listOf("1", "2", "3", "4", "5", "6", "7") l.chunked(3, List<String>::joinToString).forEach(::println)
这里List<String>::joinToString表示的是“任意List<String>实例的joinToString方法”,Kotlin会自动把它转换为(List<String>) -> String类型的函数,刚好匹配chunked的参数要求,运行结果和原来的Lambda版本完全一致。
内容的提问来源于stack exchange,提问作者lukeg
相关产品推荐
相关产品推荐

