在 JVM 上,我们定义的 lambda 会以对象实例的形式存在。 JVM 会为所有同 lambda 打交道的
变量分配内存,这就产生了内存开销。更糟的是, lambda 的内存开销会带来严重的性能问题。显
然,这种性能问题应当避免。
可以看到,使用lambda表达式时,编译后,实际会通过反射以及创建了相关的局部变量;
幸运的是, Kotlin 有一种优化机制叫内联,可以解决 lambda 引起的内存开销问题。有了内联,
JVM 就不需要使用 lambda 对象实例了,因而避免了变量内存分配。
为了使用内联方法优化 lambda,以 inline 关键字标记使用 lambda 的函数即可:
有了 inline 关键字后,调用 runSimulation 函数就不会使用 lambda 对象实例了 。哪里需
要使用 lambda,编译器就会将函数体复制粘贴到哪里。
可以看到, runSimulation 函数没有被调用。现在, runSimulation 函数调用 lambda 执行
的工作已直接内联到 main 函数里了。这避免了 lambda 函数的传递,因此也就不需要创建新的对
象实例了。
注意:使用 inline 关键字标记使用 lambda 的函数是个好主意。 然而, 有时却不一定行。
例如,使用 lambda 的递归函数就无法内联,因为内联递归函数会让复制粘贴函数体的行为无限
循环。如果你非要尝试,编译器也会发出警告并阻止你这么做。