Подтвердить что ты не робот

Как сопоставить варианты соответствия в Котлин?

Можно ли написать что-то подобное, или нам нужно вернуться к ручной нулевой проверке в Kotlin?

val meaningOfLife : String? = null

when meaningOfLife {
    exists -> println(meaningOfLife)
    else   -> println("There no meaning")
}
4b9b3361

Ответ 1

Один из возможных способов состоит в том, чтобы сначала совместить null, так что в ветке else String? неявно преобразуется в 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")

let in stdlib