假设您创建了一个采用 lambda 类型的高阶函数() -> Unit
(无参数,无返回值),并像这样执行:
fun nonInlined(block: () -> Unit) {
println("before")
block()
println("after")
}
用 Java 的话说,这将翻译成这样(简化的!):
public void nonInlined(Function block) {
System.out.println("before");
block.invoke();
System.out.println("after");
}
当你从 Kotlin 调用它时......
nonInlined {
println("do something here")
}
在引擎盖下,有一个实例Function
将在此处创建,将代码包装在 lambda 内(同样,这是简化的):
nonInlined(new Function() {
@Override
public void invoke() {
System.out.println("do something here");
}
});
所以基本上,调用这个函数并向它传递一个 lambda 总是会创建一个Function
object.
另一方面,如果您使用inline
关键词:
inline fun inlined(block: () -> Unit) {
println("before")
block()
println("after")
}
当你这样称呼它时:
inlined {
println("do something here")
}
No Function
将创建实例,而不是调用周围的代码block
内联函数内部的内容将被复制到调用站点,因此您将在字节码中得到如下内容:
System.out.println("before");
System.out.println("do something here");
System.out.println("after");
在这种情况下,不会创建新实例。