![](/img/trans.png)
[英]How to implement Callback(Kotlin) before use Kotlin lib in Android Java
[英]How to use Kotlin parameter callback interoperable with a java class
这个问题是关于 Kotlin 中的参数回调,顺便说一句,从我的角度来看,这是一个非常好的功能!
我有一个用 Kotlin 编写的方法,就像这个期望回调作为参数的方法。 回调本身需要一个 String 参数,该参数应提供给回调调用接收者:
`private fun m1(number: Int, callback: (result: String) -> Unit) {
//some other stuff..
val string = "Foo"
callback.invoke(string)
}`
然后通常我会像这样在 Kotlin 中使用它:
m1(101) { processResult( it m1(101) { processResult(it) }
而实际结果是
但是......如果方法的调用者是Java class,如何获取和处理回调结果? 我尝试了类似的方法,但它不起作用:
`m1(101, () -> processResult(result));`
谢谢你的帮助。 回头见。
这是您需要在 java 中调用更高阶 function 的方法。
使用 Lambda:
m1(101, () -> {
processResult(result)
return null; //or return Unit.INSTANCE;
});
不带 Lambda:
m1(101,new Function0<Unit>() {
@Override
public Unit invoke() {
System.out.println("Hello");
return null; //or return Unit.INSTANCE;
}
});
可以看到上面的调用 function。 它返回单位。 单位类似于 Java 中的 void。 Kotlin 采用默认值。 但在 java 中,您需要返回 Unit 实例。 您可以return null
或Unit.Instance
。 两者都将正常工作,因为它不会对此处的返回值做任何事情。 这里Function0
是一个接口,它在调用方法中采用零参数。 同样,如果您高阶 function 包含 1 个参数,则需要使用Function1
等等。
感谢您的快速回复。
我使用了来自@k314159 的建议语法,即: m1(101, result -> processResult(result));
它有效。 但是我需要在我的方法m1()
中返回null
或Unit.INSTANCE
我发现在这种情况下,我可以在 java 中使用方法引用而不是 lambda 作为参数:
m1(101, this::processResult);
@Gowtham 的答案完全解决了我的问题,而无需更改我方法中的代码。 我做了类似的事情: m1(101, result -> { process(result); return null; /* or return Unit.INSTANCE */ });
这让我很开心:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.