Kotlin中“ let”关键字的目的是什么

时间:2019-10-29 11:33:30

标签: kotlin

我们可以编写带有或不带有let的代码,如下所示。

var str = "Hello World"
str.let { println("$it!!") }

OR

var str = "Hello World"
println("$str!!")

let的实际用途是什么?是提高内存使用效率还是提高可读性?

3 个答案:

答案 0 :(得分:2)

let是Kotlin的Scope函数之一,可让您在对象的上下文中执行代码块。在这种情况下,上下文对象为str。其中有五个:letrunwithapplyalso。它们的用法范围从但不限于初始化和映射。

它们都很相似,但是在引用上下文对象和返回值方面不同。在let的情况下,上下文对象由it关键字而不是this关键字引用。返回值是从lambda代码块返回的值。其他范围函数,例如apply将返回上下文对象。

由于let返回lambda块求值的内容,因此它最适合执行某种映射:

var upperStr = str.let { it.toUpperCase()}

apply是更适合您正在执行的功能。

要回答有关哪种代码更可取的问题,这实际上取决于您使用范围函数的作用。在上述情况下,没有理由使用let。如果您使用的是IntelliJ,则会发出警告,指出对let的调用是多余的。这里的可读性是一个优先事项,可能是首选。

当您希望通过使用let运算符safe call对对象执行null安全操作时,?.函数非常有用。执行此操作时,let代码块仅当对象不为null时才执行。使用let的另一个原因是,如果您需要为该操作引入新变量,但希望将它们限制在let块的范围内。对于所有作用域函数都是如此,因此我重申let最适合用于映射操作。

编辑:let函数不会产生任何额外费用。通常,我们希望将lambda / Code-block编译为Function对象,但对于Kotlin中的inline函数而言,情况并非如此,编译器将为此生成与第二个代码相同的代码你给的例子。有关更多信息,请参见documentation

答案 1 :(得分:1)

您可以检查可空类型的一种用法

var str: String? = null
str?.let { println("$it!!") }

等于

if (str != null) {
   System.out.println(str);
}

在Java中,但更简短,更有用

答案 2 :(得分:0)

let将调用它的对象作为参数,并返回lambda表达式的结果。 Kotlin let是一个作用域函数,其中表达式内部声明的变量不能在外部使用。

其中一个示例将在这里:

fun main(args: Array<String>) {
    var str = "Hello World"
    str.let { println("$it!!") }
    println(str)

}

您可以找到有关Kotlin let函数here

的更多信息