【问题标题】:What is the purpose of 'let' keyword in Kotlin [duplicate]Kotlin中'let'关键字的目的是什么[重复]
【发布时间】:2019-10-29 11:33:30
【问题描述】:

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

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

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

let 的实际用途是什么?是更节省内存还是更易读?

【问题讨论】:

  • 这应该会有所帮助:link
  • 1. str 应该是 val 和 2. 在此示例中使用 let 没有任何好处

标签: kotlin


【解决方案1】:

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

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

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

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

apply 是更适合您正在做的事情的函数。

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

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

编辑:let 函数不会产生额外费用。通常我们希望 lambda/代码块被编译为 Function 对象,但 Kotlin 中的 inline 函数并非如此,编译器将发出与您给出的第二个代码示例相同的代码.请参阅documentation 了解更多信息。

【讨论】:

    【解决方案2】:

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

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

    相等

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

    在 Java 中,但更短且更有用

    【讨论】:

    • 很遗憾?.let {} ?: 不等同于if(!=null) else {},因此您可能只想在实际分配中使用let,而不是在整个代码中使用
    • @EpicPandaForce 但if(!=null) else {} 也可以写成?.let { /* if != null content */ } ?: run { /* else content */ }... 还是你的意思是别的?
    • @Roland 没错,但是这两个语句实际上并不等价。所以人们通常不应该使用这个?: run { 的东西,除非他们 100% 确定他们知道自己在做什么。否则,请使用if else
    • @EpicPandaForce 取决于你如何使用它,对吧?如果我们暂时跳过“等效”(因为在引擎盖下它们确实更加不同),至少我们可以说以下将导致相同的结果:val x = if (y != null) y+1 else z 类似于 val x = y?.let { it + 1 } ?: run { z } ... 后者如果y 是可变的并在另一个线程中更改,则更安全...
    【解决方案3】:

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

    这里有一个例子:

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

    你可以找到更多关于 Kotlin let function here的信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 2018-06-17
      • 2022-11-21
      相关资源
      最近更新 更多