使用Kotlin的“let”的合理情况
在Kotlin中,如果一个对象( let
接收者)不为null
,那么通常使用let
来执行代码,以替代if != null
检查,如下所示:
val nullable: String? = "anything" nullable?.let { println(it) }
在其他情况下,利用let
是否有意义?
仅供参考, let
Kotlin的stdlib,定义如下:
@kotlin.internal.InlineOnly public inline fun T.let(block: (T) -> R): R = block(this)
我见过let
用来限制嵌套variables(忽略let
返回):
some.nested.foo.bar.let { bar -> doSomething(bar) doMoreStuff(bar) }
它可以很好,因为它取代了定义一个局部variables的需求,但我不确定它实际上是多么有用。
也可以用apply
来完成,尽管可读性稍差,(而不是范围中的bar
)。
当您使用可为空的var
variables时, let
也很有用。 例如,我们有这个代码
fun doSomething(value: String) { } class A { var boo: String? = null fun b() { if (boo != null) { doSomething(boo) } } }
在那里, if
块内部有编译时错误,因为boo
可以在外面改变。 为了解决这个问题,我们应该创建一个val
variables
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) } } }
范围界定能力
stdlib函数let
你可以将variables的作用域限制在一个特定的代码块中。 如下所示:
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的compile
单元,因此我们将variablesio.vertx:vertx
限制在let
块中。
在这个线程中可以find关于不同范围函数替代的信息。
- 在Instant App中应用插件“kotlin-android”会导致“null不能转换为非空types的com.android.build.gradleBasePlugin”
- 具有派生属性的Kotlin数据类
- types推断失败。 请尝试指定types参数显式:Kotlin
- Kotlin lateinit属性,NPE危险?
- Android / Kotlin:未解决的参考:木材
- 在Android Studio中将代码从Java转换为Kotlin
- 移除Firebase侦听器不适用于Android
- 当使用AsyncTask 将Object转换为GoogleMap时,我得到java.lang.RuntimeException
- 类未find,androidTest中使用Android Studio 3.0.1,Room,Kotlin的空测试套件