我们可以编写包含或不包含let
的代码,如下所示。
var str = "Hello World"
str.let { println("$it!!") }
或
var str = "Hello World"
println("$str!!")
let
的实际用途是什么?。这是内存效率更高还是可读性更强?
let将调用它的对象作为参数,并返回lambda表达式的结果。Kotlin let是一个作用域函数,其中表达式内部声明的变量不能在外部使用。
其中一个例子如下:
fun main(args: Array<String>) {
var str = "Hello World"
str.let { println("$it!!") }
println(str)
}
您可以在此处找到有关Kotlin let函数的更多信息
您可以检查可为空类型的用法之一
var str: String? = null
str?.let { println("$it!!") }
这是平等的
if (str != null) {
System.out.println(str);
}
Java但更短更有用
let
是Kotlin的Scope函数之一,它允许您在对象的上下文中执行代码块。在这种情况下,上下文对象是str
。其中有五个:let
,run
,with
,Application
和也
。它们的用法范围从初始化和映射,但不仅限于初始化和映射。
它们都非常相似,但在引用上下文对象的方式和返回的值方面有所不同。在let
的情况下,上下文对象由it
关键字引用,而不是this
关键字引用。返回值是从lambda代码块返回的值。其他作用域函数如apply
将返回上下文对象。
因为let
返回lambda块的计算结果,所以它最适合执行某种映射:
var upperStr = str.let { it.toUpperCase()}
apply是一个更适合您所做工作的函数。
要回答您关于哪种代码更可取的问题,这实际上取决于您使用scope函数的目的。在上述情况下,没有理由使用let
。如果您正在使用IntelliJ,它将发出警告,指出对let
的调用是多余的。这里的可读性是一个偏好的问题,并且可能是首选。
当您希望使用安全调用
操作符
?,对对象执行空安全操作时,
执行此操作时,仅当对象不为null时才会执行let
函数非常有用let
代码块。使用let的另一个原因是,如果需要为操作引入新变量,但希望将它们限制在let块的范围内。这适用于所有作用域函数,因此我重申,最好将let
用于映射操作。
编辑:
let
功能不应产生额外成本。通常,我们希望lambda/Code块被编译成函数
对象,但对于Kotlin中的内联
函数,编译器将为其发出与您给出的第二个代码示例相同的代码。有关更多信息,请参阅文档。
在为android开发时,我有时会遇到类似这样的事情: 我不明白关键字有什么意义。
问题内容: ECMAScript 6应该提供块范围,而不会引起麻烦。有人可以解释为什么在函数下面的代码中解析为循环中的最后一个值(与一样),而不是当前迭代中的值吗? 根据MDN在这样的循环中使用应将变量绑定在循环主体的范围内。当我在块中使用临时变量时,事情按我期望的那样工作。为什么有必要? 我使用Traceur和来测试了脚本。 问题答案: quin着眼睛的答案不再是最新的。在ECMA 6规范中,指
问题内容: 我想知道这些关键字在sql server中的用途以及何时使用它?我的意思是人们会遇到什么情况。 只是看到他们使用上面的SQL ,是什么,? 会发生什么,? 什么是?当我们使用时会发生什么? 这里上面的sql用于更新语句,并且还在嵌套的select子查询中……为什么? 会发生什么? 我的要求是,请以大量示例说明每个要点,以使我可以理解这些关键字的用法。谢谢 问题答案: 它们是用于指定锁定
问题内容: 我在kotlin-stdlib中遇到了注解,我想知道它是做什么用的,但是不幸的是,它没有记录。(UPD:那时) 据我了解,将其应用于程序元素会将修饰符添加到相应的字节码元素中。结果,该元素在Java中变得不可见: Java代码中的某处: 但是相同的元素在Kotlin代码中仍然可见: 隐藏来自非Kotlin来源的声明是否有效使用?它是预期用途吗?还有哪些其他合适的用例? 由于从Java隐
问题内容: 我正在学习如何将Redis用于我的项目。我没弄清楚的一件事是键名称中冒号的确切用途。 我看到过这样的键名: 冒号是否将密钥分为几类,从而使查找密钥的速度更快?如果是这样,您在命名键时可以使用多个冒号将它们划分为子类别吗?最后,它们与在Redis服务器中定义不同的数据库有关吗? 我已经阅读了文档,并对此事进行了大量Google搜索,但奇怪的是我找不到任何讨论此事的信息。 问题答案: 冒号