Можно ли написать что-то подобное, или нам нужно вернуться к ручной нулевой проверке в Kotlin?
val meaningOfLife : String? = null
when meaningOfLife {
exists -> println(meaningOfLife)
else -> println("There no meaning")
}
Ответ 1
Один из возможных способов состоит в том, чтобы сначала совместить null, так что в ветке elseString? неявно преобразуется в String:
val meaningOfLife: String? = null
when (meaningOfLife) {
null -> println("There no meaning")
else -> println(meaningOfLife.toUpperCase()) //non-nullable here
}
Это частный случай smart cast, выполняемый компилятором.
Аналогичный эффект может быть достигнут с помощью is String и else ветвей - is String -check true, когда значение не равно null.
Для получения дополнительных идиом о нулевой безопасности см. этот ответ.
Ответ 2
Вы можете сделать это следующим образом:
val meaningOfLife: String? = null
when (meaningOfLife) {
is String -> println(meaningOfLife)
else -> println("There no meaning")
}
Ответ 3
FYI, конкретная ситуация в вопросе имеет простое решение с оператором ?: значения по умолчанию:
println(meaningOfLife ?: "There no meaning")
Пример в вопросе, вероятно, является упрощенной реальной ситуацией, поэтому нулевая проверка - это то, как я это сделаю. IMHO if - лучший способ пойти, когда у вас есть бинарный выбор потока управления:
if(meaningOfLife != null)
println(meaningOfLife)
else
println("There no meaning")
Принимает ровно столько же строк, BTW.
Ответ 4
Попробуйте следующее:
val meaningOfLife : String? = null
meaningOfLife?.let { println(it) } ?: println("There no meaning")