Kotlinlambdas在底层与Javalambdas相同吗?
这是这个答案的后续问题。
但是当应用程序之前没有使用过 lambda 表达式时¹,甚至必须加载用于生成 lambda 类的框架(Oracle 当前的实现在幕后使用 ASM)。这是十几个内部使用的类的减速、加载和初始化的实际原因,而不是 lambda 表达式本身
好的,Java 使用 ASM 在运行时生成类。我发现了这一点,如果我理解正确的话,它基本上是说 Kotlin lambdas 被编译为在运行时加载(而不是生成)的预先存在的匿名类。
如果我是对的,Kotlin lambdas 与 Java 不同,不应该具有相同的性能影响。有人可以确认吗?
回答
当然,Kotlin 内置了对内联 lambda 的支持,而 Java 没有。Kotlin 代码中的许多 lambda 表达式在运行时根本不对应任何对象。
但是对于那些不能内联的,是的,根据https://medium.com/@christian.c.carroll/exploring-kotlin-lambda-bytecode-8c2d15afd490似乎总是使用匿名类翻译。不幸的是,该帖子没有指定 Kotlin 版本(1.3.30 是当时可用的最新版本)。
我也会认为这是一个实现细节,至少在jvmTarget设置为"1.8"或更高时,它可能会根据 Kotlin 版本而改变;所以没有什么可以替代实际检查您自己的字节码。