На этом шаге мы рассмотрим назначение и использование этого оператора.
Еще один вариант проверки значения на 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, используя подобный стиль? Мы не можем дать ответ на этот вопрос, потому что это дело вкуса. Приемлемы оба стиля.
Со следующего шага мы начнем рассматривать исключения.