Шаг 70.
Основы Kotlin.
Null-безопасность и исключения. Null-безопасность. Оператор ?:

    На этом шаге мы рассмотрим назначение и использование этого оператора.

    Еще один вариант проверки значения на null - это оператор ?: (null coalescing operator, или оператор объединения по null, также известный как оператор "Элвис", потому что похож на прическу Элвиса Пресли). Оператор как бы говорит: "Если операнд слева от меня - null, выполнить операцию справа".

    Добавьте выбор напитка по умолчанию с помощью оператора ?:. Если beverage равно null, выведите название фирменного напитка Buttered Ale.

fun main() {
    var beverage = readLine()
//    beverage = null
    if (beverage != null) {
        beverage = beverage.capitalize()
    } else {
        println("I can't do that without crashing - beverage was null!")
    }
    println(beverage)
    val beverageServed: String = beverage ?: "Buttered Ale"
    println(beverageServed)
}
Файл с проектом можно взять здесь.


Рис.1. Использование оператора ?: (Tavern.kt)

    Чаще всего мы опускаем тип переменной, если компилятор Kotlin может определить его автоматически. Мы добавили его в пример, чтобы показать роль оператора ?:.

    Если значение beverage не равно null, оно будет присвоено переменной beverageServed. Если beverage равно null, тогда будет присвоено значение "Buttered Ale". В любом случае переменной beverageServed присваивается значение типа String, а не String?. Это хорошо, потому что посетитель гарантированно получит существующий напиток.

    Рассматривайте оператор ?: как способ убедиться, что значение не null, и получить значение по умолчанию, если все-таки оно null. Оператор ?: помогает избавиться от значений null, чтобы вы могли спокойно работать.

    Запустите Tavern.kt. До тех пор пока значение beverage отлично от null, вы будете получать заказ на напиток с прописной буквой. Как только beverage получит значение null, вы увидите следующее сообщение:

  I can't do that without crashing - beverage was null!
  Buttered Ale


Рис.2. Результат работы приложения

    Оператор ?: можно использовать в сочетании с функцией let вместо оператора if/else. Сравните этот код из примера выше:

    if (beverage != null) {
        beverage = beverage.capitalize()
    } else {
        println("I can't do that without crashing - beverage was null!")
    }
с этим:
    var beverage = readLine()?.let {
        beverage = it.capitalize()
        } ?: println("I can't do that without crashing - beverage was null!")

    Этот вариант функционально эквивалентен предыдущему коду. Если beverage null, тогда в консоль выводится "I can't do that without crashing - beverage was null!". В противном случае название напитка в beverage выводится с прописной буквы.

    Означает ли это, что вы должны заменить существующие if/else, используя подобный стиль? Мы не можем дать ответ на этот вопрос, потому что это дело вкуса. Приемлемы оба стиля.

    Со следующего шага мы начнем рассматривать исключения.




Предыдущий шаг Содержание Следующий шаг