В Kotlin я могу запустить код, если объект не имеет нулевого значения:
data?.let {
... // execute this block if not null
}
но как я могу выполнить блок кода, если объект имеет значение null?
В Kotlin я могу запустить код, если объект не имеет нулевого значения:
data?.let {
... // execute this block if not null
}
но как я могу выполнить блок кода, если объект имеет значение null?
Просто используйте обычный if
:
if (data == null) {
// Do something
}
Вы можете использовать elvis оператор и оценить другой блок кода с помощью run { ... }
:
data?.let {
// execute this block if not null
} ?: run {
// execute this block if null
}
Но это, похоже, не так читается, как простой оператор if
- else
.
Кроме того, вы можете найти этот Q & полезный:
Вы можете создать такую инфиксную функцию, как это:
infix fun Any?.ifNull(block: () -> Unit) {
if (this == null) block()
}
Затем вы можете сделать это:
data ifNull {
// Do something
}
Вот краткий синтаксис с использованием оператора Элвиса. Напомним, что оператор Элвиса выполняет только правую сторону, если левая сторона оценивается как ноль.
data ?: doSomething()
Вы можете использовать ниже код
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
Еще одним хорошим вариантом является использование, when
:
when(myVariable){
null -> {
// execute your null case here
}
else -> { // non null case }
}
when
он довольно универсален, чтобы вы могли указать точные условия, включая нулевой регистр.