【问题标题】:How do I pass a lambda from Java to a Kotlin method?如何将 lambda 从 Java 传递给 Kotlin 方法?
【发布时间】:2019-04-10 16:59:07
【问题描述】:

我可以从 Java 中调用这个 Kotlin 方法吗?

fun foo(() -> Unit)

如果有,语法是什么?

【问题讨论】:

    标签: java kotlin lambda


    【解决方案1】:

    你需要创建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】:

      您可以调用它,但需要注意返回类型。如果您的 Kotlin 函数返回 Unit,Java 将需要返回 Unitnull,因为 voidUnit 并不完全相同。

      我的例子有效:

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

      或者,如果您想真正明确地谈论Unit...

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

      【讨论】:

      • 你确定null?本质不会说“预期非空但收到空”吗?
      • @EpicPandaForce 我很担心,但我运行它并没有任何抱怨。
      【解决方案3】:

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

      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;
          }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多