如何使用可与java类互操作的Kotlin参数回调



这个问题是关于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) }实际结果是

但是。。。如果方法的调用方是Java类,如何获取和处理回调结果?我试过这样的东西,但它不起作用:

`m1(101, () -> processResult(result));`

谢谢你的帮助!回头见。

以下是您需要如何在java中调用高阶函数。

使用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;

}
});

您可以看到上面的invoke函数。它返回单位。Unit类似于Java中的void。Kotlin采用默认值。但在java中,您需要返回Unit实例。您可以return nullUnit.Instance。两者都将起作用,因为它对这里的返回值没有任何作用。这里Function0是一个接口,它在invoke方法中采用零参数。类似地,如果高阶函数包含1个参数,则需要使用Function1

感谢您的快速回复。

我使用了@k314159中提出的语法,即:m1(101, result -> processResult(result));,它很有效。但是我需要在我的方法m1()中返回nullUnit.INSTANCE

我发现在这种情况下,我也可以在java中使用方法引用而不是lambda作为参数:

m1(101, this::processResult);

来自@Gowtham的答案完全解决了我的问题,而没有更改我方法中的代码。我做了一些类似的事情:m1(101, result -> { process(result); return null; /* or return Unit.INSTANCE */ });

这让我度过了一天:(

最新更新