如何将lambda从Java传递到Kotlin方法?

时间:2019-04-10 16:59:08

标签: java kotlin lambda

我可以从Java调用此Kotlin方法吗?

fun foo(() -> Unit)

如果是这样,语法是什么?

3 个答案:

答案 0 :(得分:4)

您可以调用此方法,但需要注意返回类型。如果您的Kotlin函数返回Unit,则Java将需要返回Unitnull,因为voidUnit不太相同。

我的示例有效:

foo(() -> {
    System.out.println("Hi");
    return null;
});

或者,如果您想对Unit进行露骨的话...

foo(() -> {
    System.out.println("Hi");
    return Unit.INSTANCE;
});

答案 1 :(得分:3)

您需要创建Function0的实例:

foo(new Function0<Unit>() {
    @Override
    public Unit invoke() {
        // Here should be a code you need
        return null;
    }
});

或者如果您使用Java 8,则可以简化

foo(() -> {
    // Here should be a code you need
    return null;
});

答案 2 :(得分:0)

我完全同意安德鲁的回答,有更好的方法

  1. 您需要查看生成的 Kotlin 字节码 -> 反编译

就你而言,它看起来像这样:

   public static final void foo(@NotNull Function0 acceptLambda) {
      Intrinsics.checkNotNullParameter(acceptLambda, "acceptLambda");
   }

现在你知道为了从Java调用这个函数,你需要像这样创建Function0的实例

foo(new Function0<Unit>() {
    @Override
    public Unit invoke() {
        // Your Code
        return null;
    }
});