如果object为null,如何运行代码?

Ton*_*Joe 31 kotlin kotlin-null-safety

在Kotlin中,如果对象不是null,我可以运行代码:

data?.let {
    ... // execute this block if not null
}
Run Code Online (Sandbox Code Playgroud)

但如果对象为null,我该如何执行代码块?

hot*_*key 102

您可以使用elvis运算符并使用以下代码评估另一个代码块run { ... }:

data?.let {
    // execute this block if not null
} ?: run {
    // execute this block if null
}
Run Code Online (Sandbox Code Playgroud)

但是,这似乎并没有被相当的简单,可读if- else声明.

此外,您可能会发现此问答有用:

  • 注意,如果`let {}`返回`null`,两个块都将运行! (16认同)
  • `apply {}` 会更安全。 (5认同)

Dmi*_*nko 25

您可以创建这样的中缀函数:

infix fun Any?.ifNull(block: () -> Unit) { 
  if (this == null) block()
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

data ifNull {
  // Do something
}
Run Code Online (Sandbox Code Playgroud)

  • 使用这种方法要小心,因为 ```something.ifNull{}``` 会起作用,而 ```something?.ifNull{}``` 不会被调用! (2认同)

Pix*_*ant 14

只需使用正常if:

if (data == null) {
  // Do something
}
Run Code Online (Sandbox Code Playgroud)


M. *_*ich 13

这是使用Elvis运算符的简洁语法。回想一下,Elvis运算符仅在左侧计算为null时才执行右侧。

data ?: doSomething()
Run Code Online (Sandbox Code Playgroud)


iro*_*oys 9

您可以使用以下代码

myNullable?.let {

} ?: { 
    // do something
}()
Run Code Online (Sandbox Code Playgroud)

你也可以省略 fun()

myNullable?.let {

} ?: fun() { 
    // do something
}()
Run Code Online (Sandbox Code Playgroud)

或者你可以打电话invoke()而不是()

myNullable?.let {

} ?: fun() { 
    // do something
}.invoke()
Run Code Online (Sandbox Code Playgroud)

请注意,返回值与下面不同。

val res0 = myNullable?.let {
} ?: () {

}()
val res1 = myNullable?.let {
} ?: fun() {
    "result"    
}()
val res2 = myNullable?.let {
} ?: () {
    "result"    
}()


println("res0:$res0")
println("res1:$res1")
println("res2:$res2")
Run Code Online (Sandbox Code Playgroud)

结果:

res0:kotlin.Unit // () {} with empty
res1:kotlin.Unit // fun() {}
res2:result      // () {} with return
Run Code Online (Sandbox Code Playgroud)