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

时间:2017-08-21 14:45:58

标签: kotlin kotlin-null-safety

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

data?.let {
    ... // execute this block if not null
}

但如果对象为null,我怎么能执行代码块呢?

8 个答案:

答案 0 :(得分:76)

您可以使用elvis operator并使用run { ... }评估另一段代码:

data?.let {
    // execute this block if not null
} ?: run {
    // execute this block if null
}

但这似乎不像简单的if - else声明那么可读。

此外,您可能会发现此Q& A很有用:

答案 1 :(得分:21)

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

infix fun Any?.ifNull(block: () -> Unit) { 
  if (this == null) block()
}

然后你可以这样做:

data ifNull {
  // Do something
}

答案 2 :(得分:11)

只需使用普通的if

if (data == null) {
  // Do something
}

答案 3 :(得分:8)

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

data ?: doSomething()

答案 4 :(得分:1)

您可以使用以下代码

myNullable?.let {

} ?: { 
    // do something
}()

您还可以省略fun()

myNullable?.let {

} ?: fun() { 
    // do something
}()

或者您可以呼叫invoke()而不是()

myNullable?.let {

} ?: fun() { 
    // do something
}.invoke()

请注意,返回值如下所示。

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

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


println("res0:$res0")
println("res1:$res1")
println("res2:$res2")

结果:

res0:kotlin.Unit // () {} with empty
res1:kotlin.Unit // fun() {}
res2:result      // () {} with return

答案 5 :(得分:0)

我更喜欢这种解决方案,

fun runIfNull(any: Any?, block: () -> Unit) {
        if (any == null) block()
}

您用作哪个:

runIfNull(any) { // it will run; }

与@Dmitry Ryadnenko的答案相比,它具有优势, 可能会让人困惑并且可能使用不正确的地方。
那里有一个功能

infix fun Any?.ifNull(block: () -> Unit) { 
  if (this == null) block()
}

如果您以下列方式在空对象上使用它:

nullObject?.ifNull { // THIS WILL NOT BE CALLED }
nullObject.ifNull { // this will be called }

该块将不被执行。
请注意错误添加的问号'?'

答案 6 :(得分:0)

let 也可以应用于 null,无论对象是否为 null:

data.let {d->
    if (d != null){
        // execute this block if data is not null
    } else {
        // for data is null
    }
}

答案 7 :(得分:-1)

另一个好的选择是使用when

when(myVariable){   
    null -> {
            // execute your null case here
        }
    else -> { // non null case }
}

when用途广泛,因此您可以放置​​包括空值在内的确切条件。