我怎样才能创建一个“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::append
find的函数不能在这里应用。 有什么办法可以做出这样的工作吗?
在这种情况下使用方法引用没有问题,它应该完美地工作。
只要确保你使用kotlin类的StringBuilder
可以改变这个:
fun
由这一个:
fun
您正尝试使用具有不同签名的方法引用来接收函数。 你可以使用它来提供一个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) } }