我们可以写有或没有的代码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个人:let,run,with,apply,和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 中,但更短更有用