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

Jin*_*cis 17 kotlin

我们可以写有或没有的代码let如下。

var str = "Hello World"
str.let { println("$it!!") }
Run Code Online (Sandbox Code Playgroud)

或者

var str = "Hello World"
println("$str!!")
Run Code Online (Sandbox Code Playgroud)

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

Dea*_*ean 26

let是 Kotlin 的Scope函数之一,它允许您在对象的上下文中执行代码块。在这种情况下,上下文对象是str。有5个人:letrunwithapply,和also。它们的用途范围从但不限于初始化和映射。

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

因为let返回任何 lambda 块的计算结果,它最适合执行某种映射:

var upperStr = str.let { it.toUpperCase()}
Run Code Online (Sandbox Code Playgroud)

apply是更适合您正在做的事情的功能。

要回答关于哪种代码更可取的问题,这实际上取决于您使用 scope 函数的目的。在上述情况下,没有理由使用let. 如果您使用的是 IntelliJ,它会发出警告,说明对 的调用let是多余的。这里的可读性是一个偏好问题,并且可能是首选。

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

编辑:该let功能不应产生额外费用。通常我们希望 lambda/Code-block 被编译为一个Function对象,但对于inlineKotlin 中的函数而言,情况并非如此,编译器将为其发出与您给出的第二个代码示例不同的代码。有关更多信息,请参阅文档


Art*_*nev 15

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

var str: String? = null
str?.let { println("$it!!") }
Run Code Online (Sandbox Code Playgroud)

它是平等的

if (str != null) {
   System.out.println(str);
}
Run Code Online (Sandbox Code Playgroud)

在 Java 中,但更短更有用

  • @EpicPandaForce 但 `if(!=null) else {}` 也可以写成类似 `?.let { /* if != null content */ } ?: run { /* else content */ }`.. .或者你还有别的意思吗? (2认同)