当前位置: 首页 > 知识库问答 >
问题:

使用Kotlin'let'的合理情况

梅飞龙
2023-03-14

在Kotlin中,如果对象(letreceiver)不是null,通常使用let执行代码,作为if!=空检查,如下所示:

val nullable: String? = "anything"
nullable?.let {
    println(it)
}

在其他哪些情况下,使用let有意义?

仅供参考,let是Kotlin的stdlib的一部分,定义如下:

@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)

共有3个答案

时同
2023-03-14

stdlib函数let使您能够将变量的作用域限制为特定的代码块。这里显示:

compile("a:b:c")
"io.vertx:vertx".let { v->
    compile("$v-lang-kotlin:$vertxVersion")
    compile("$v-lang-kotlin-coroutines:$vertxVersion")
} 
compile("x:y:z")

我们也可以定义一个val v:String=“io.vertx:vertx”,这可能会使代码更可读,因为这就是我们在Java中所做的。然而,在整个方法中,val是可以访问的。我们只想让它对涉及vertx的编译单元可用,因此我们将变量限制在io中。vertx:vertxlet块。

关于不同范围函数备选方案的信息可以在这个线程中找到。

暴向笛
2023-03-14

let在处理可为空的var变量时也很有用。例如,我们有这个代码

fun doSomething(value: String) {

}

class A {
    var boo: String? = null
    fun b() {
        if (boo != null) {
            doSomething(boo)
        }
    }
}

在那里,我们在if块内部有编译时错误,因为bos可以在外部更改。要解决这个问题,我们要么创建一个val变量

class A {
    var boo: String? = null
    fun b() {
        val b = boo
        if (b != null) {
            doSomething(b)
        }
    }
}

或者使用let

class A {
    var boo: String? = null
    fun b() {
        boo?.let {
            doSomething(it)
        }
    }
} 
邹嘉石
2023-03-14

我见过let用于限定嵌套变量的范围(忽略let的返回):

    some.nested.foo.bar.let { bar -> 
        doSomething(bar)
        doMoreStuff(bar)
    }

它可以很好,因为它取代了定义局部变量的需要,但我不确定它到底有多有用。

也可以使用apply,尽管可读性稍差,(this而不是范围中的bar)。

 类似资料:
  • 我知道Elasticsearch支持带bucketing的子聚合(其中bucketing聚合可以有bucketing或metric子聚合)。使用度量聚合无法进行子聚合。也许这是有道理的,但这里是用例。 作为家长,我有术语聚合。并将另一个术语聚合作为它的子项。子术语具有类型为top\u hits的子聚合

  • 问题内容: 我写了一个程序,可以总结如下: 实际代码(尤其是)要复杂得多。仅使用将其当作参数的这些值(意味着它不引用) 基本上,它将巨大的数据集加载到内存中并进行处理。输出的写操作委托给一个子进程(它实际上写到多个文件中,这需要很多时间)。因此,每次处理一个数据项时,它都会通过res_queue发送到子流程,然后该子流程根据需要将结果写入文件中。 子流程不需要访问,读取或修改以任何方式加载的数据。

  • 问题内容: 我试图在pySpark的一行代码中进行多项操作,但不确定我的情况是否可行。 我的意图是不必将输出另存为新的数据框。 我当前的代码非常简单: 我的意图是在使用后添加,以得到与每个 列值匹配的记录计数,这些记录打印\显示为输出。 尝试使用时,出现异常。 有什么方法可以同时实现和 .show()打印,而无需将代码拆分为两行命令,例如: 或更好的办法是将合并的输出输出到-额外的一栏,用于说明与

  • 问题内容: 我有大量的名称-值对(大约100k),我需要将它们存储在某种高速缓存(例如哈希映射)中,其中值是一个平均大小约为30k字节的字符串。 现在我知道一个事实,大量的值具有完全相同的字符串数据。为了避免多次分配相同的字符串数据,我想以某种方式重用以前分配的字符串,从而减少内存消耗。另外,这需要相当快。即,不能一一扫描所有先前分配的值。 关于如何解决此问题的任何建议? 问题答案: 千万 不能

  • 我试图使用来生成。出于某种原因,我无法重现我使用创建的,该代码可以毫无问题地运行。 下面是我的调用成功并返回200:

  • 【AssetBundle使用】页面展示具体的AssetBundle文件使用情况,主要包括以下几个方面: AssetBundle所包含的具体内容 “总AB数” 表示该次资源检测过程中,UWA所检测到的AssetBundle文件总量。点击 “总AB数”,即可查看具体每个被检测的AssetBundle文件,及其所包含的具体资源。 上图表格中的每一行,我们均展示了每种资源的具体使用数量。您可以对任一资源种