Kotlin作用域函数实际上是Java匿名类?
我目前正在开发一些旧的 Java 编写的 Android 项目,但正在用 Kotlin 编写我不太熟悉的新部分。我需要某种方法来解包可为空的对象(类似于if let unwrappedMyVar = myVar else {}Swift 中的),为此我使用了myVar?.let {}作用域函数,该函数解包myWar并执行块,以防它不为空。但是现在我真的很好奇这些作用域函数是如何在 Kotlin 中实现的,它们实际上是编译成 Java 匿名类的吗?如果是这样,那么它可能会导致与 Java 匿名类相同的问题。而且很容易造成泄漏
谢谢!
亲切的问候,
安德烈
回答
诸如let, apply, run, or 之类的作用域函数also以及 Kotlin 标准库中的更多函数都是inlinefunctions,这意味着您传递给它们的 lambdas 被内联在它们的主体中,然后转换后的主体在调用时被内联地点。
使用作用域函数,生成的字节码与您只需声明一个变量并在显式if-null-check后使用它所得到的字节码大致相同。