Как запустить код, если объект имеет значение null?

В Kotlin я могу запустить код, если объект не имеет нулевого значения:

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

но как я могу выполнить блок кода, если объект имеет значение null?

Ответ 1

Просто используйте обычный if:

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

Ответ 2

Вы можете использовать elvis оператор и оценить другой блок кода с помощью run { ... }:

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

Но это, похоже, не так читается, как простой оператор if - else.

Кроме того, вы можете найти этот Q & полезный:

Ответ 3

Вы можете создать такую ​​инфиксную функцию, как это:

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

Затем вы можете сделать это:

data ifNull {
  // Do something
}

Ответ 4

Вот краткий синтаксис с использованием оператора Элвиса. Напомним, что оператор Элвиса выполняет только правую сторону, если левая сторона оценивается как ноль.

data ?: doSomething()

Ответ 5

Вы можете использовать ниже код

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

Ответ 6

Еще одним хорошим вариантом является использование, when:

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

when он довольно универсален, чтобы вы могли указать точные условия, включая нулевой регистр.