繁体   English   中英

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

[英]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 nullUnit.Instance 两者都将正常工作,因为它不会对此处的返回值做任何事情。 这里Function0是一个接口,它在调用方法中采用零参数。 同样,如果您高阶 function 包含 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 */ });

这让我很开心:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM