使用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(); } }
可以看到:
- 函数类型的参数,会被实现为Function类的实例
- 没有添加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(); } }
可以看到:
- 高阶函数本身没有变化,但是调用高阶函数的地方,不再是生成匿名内部类了。而是直接使用参数中的语句。方法调用->语句调用
- 避免生成较多的匿名内部类

浙公网安备 33010602011771号