我怎样才能创建一个“forEach”,返回一个对象是一个接收器的消费函数?

我正在尝试在“流”操作的长链中做这样的事情。

fun main(args: Array) { "test1, test2, test3".split(", ") .toCustomString(StringBuilder(), StringBuilder::append) } fun Iterable.toCustomString(obj: R, thing: R.(T) -> Unit): R { this.forEach { obj.thing(it) } return obj } 

但是这不起作用,因为没有任何为StringBuilder::appendfind的函数不能在这里应用。 有什么办法可以做出这样的工作吗?

在这种情况下使用方法引用没有问题,它应该完美地工作。

只要确保你使用kotlin类的StringBuilder可以改变这个:

fun Iterable.toCustomString(obj: R, thing: R.(T) -> Unit)

由这一个:

fun Iterable.toCustomString(obj: R, thing: R.(T) -> R)

您正尝试使用具有不同签名的方法引用来接收函数。 你可以使用它来提供一个lambda。 或者如其他答案指出的那样,更改接收函数的签名。

 fun main(args: Array) { "test1, test2, test3".split(", ") .toCustomString(StringBuilder(), { item -> append(item) }) } 

为了使用StringBuilder::append作为函数引用, thing应该有typesR.(T) -> R而不是R.(T) -> Unit因为StringBuilder.append(String)将返回StringBuilder 。 但是,由于toCustomString不处理来自StringBuilder.append的返回值,因此@Marko建议的更合适。

FYR,这是一个没有额外的扩展function的替代方法:

 val customString = StringBuilder().apply { "test1, test2, test3" .split(", ") .forEach { this.append(it) } }