使用kotlin的inline前后变化

fun HighFunc(func1: () -> String, func2: () -> String): String {
    return func1() + func2()
}

fun main() {
    print(HighFunc(func1 = {
        println("func1")
        "func1"
    }, func2 = {
        println("func2")
        "func2"
    }))
}

反编译成Java代码之后:

public final class TestKt {
   @NotNull
   public static final String HighFunc(@NotNull Function0 func1, @NotNull Function0 func2) {
      Intrinsics.checkNotNullParameter(func1, "func1");
      Intrinsics.checkNotNullParameter(func2, "func2");
      return (String)func1.invoke() + (String)func2.invoke();
   }

   public static final void main() {
      String var0 = HighFunc((Function0)null.INSTANCE, (Function0)null.INSTANCE);
      boolean var1 = false;
      System.out.print(var0);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
      main();
   }
}

可以看到:

  1. 函数类型的参数,会被实现为Function类的实例
  2. 没有添加lambda的时候,会把Function类的实例,一个匿名内部类,作为参数传参

 

 

使用了inline之后:

public final class TestKt {
   @NotNull
   public static final String HighFunc(@NotNull Function0 func1, @NotNull Function0 func2) {
      int $i$f$HighFunc = 0;
      Intrinsics.checkNotNullParameter(func1, "func1");
      Intrinsics.checkNotNullParameter(func2, "func2");
      return (String)func1.invoke() + (String)func2.invoke();
   }

   public static final void main() {
      int $i$f$HighFunc = false;
      StringBuilder var4 = new StringBuilder();
      int var1 = false;
      String var2 = "func1";
      boolean var3 = false;
      System.out.println(var2);
      String var5 = "func1";
      var4 = var4.append(var5);
      var1 = false;
      var2 = "func2";
      var3 = false;
      System.out.println(var2);
      var5 = "func2";
      String var6 = var4.append(var5).toString();
      var1 = false;
      System.out.print(var6);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
      main();
   }
}

可以看到:

  1. 高阶函数本身没有变化,但是调用高阶函数的地方,不再是生成匿名内部类了。而是直接使用参数中的语句。方法调用->语句调用
  2. 避免生成较多的匿名内部类
posted @ 2021-08-30 16:39  ou尼酱~~~  阅读(179)  评论(0)    收藏  举报