Что такое elvis-оператор (?:) и когда он полезен?
Elvis-оператор (?:) в Kotlin — это удобная конструкция для обработки null-значений. Он используется для указания значения по умолчанию, если выражение слева от оператора даёт null.
Название происходит от схожести символа ?: с боковым силуэтом Элвиса Пресли — "Elvis operator".
Синтаксис
val result = someValue ?: defaultValue
-
someValue — может быть null;
-
если someValue не null, результат — это someValue;
-
если someValue null, результат — defaultValue.
Примеры использования
Пример 1: Значение по умолчанию
val name: String? = null
val displayName = name ?: "Гость"
println(displayName) // → Гость
Пример 2: Комбинация с вызовом метода
fun getUsername(user: User?): String {
return user?.name ?: "Аноним"
}
Здесь user?.name безопасно обращается к name, и если результат null, будет возвращено "Аноним".
Альтернатива if
Без elvis-оператора тот же код выглядел бы громоздко:
val name = if (user != null && user.name != null) user.name else "Аноним"
Elvis делает это короче и чище:
val name = user?.name ?: "Аноним"
Использование с throw или return
Elvis-оператор может завершать выполнение функции, если слева null.
Пример 1: throw
val user = getUser() ?: throw IllegalArgumentException("User is required")
Если getUser() вернёт null, выбрасывается исключение.
Пример 2: return
fun printUser(user: User?) {
val name = user?.name ?: return
println("Имя: $name")
}
Если user?.name — null, функция завершится без вывода.
Комбинация с цепочкой вызовов
val city = user?.address?.city ?: "Неизвестный город"
Если user, address или city — null, результат — "Неизвестный город".
Пример с функцией
fun getLength(s: String?): Int {
return s?.length ?: 0
}
Если строка null, возвращается 0, иначе длина строки.
Когда полезен elvis-оператор
-
При установке значения по умолчанию;
-
При коротком выходе из функции, если значение null;
-
При комбинировании с safe-call (?.);
-
При обработке nullable значений без большого количества if-else;
-
При исключениях, если null считается критичной ошибкой.
Сравнение с Java
В Java приходилось бы писать:
String name = user != null && user.getName() != null ? user.getName() : "Unknown";
В Kotlin это:
val name = user?.name ?: "Unknown"
Таким образом, elvis-оператор помогает писать короткий, чистый и безопасный код, особенно при работе с null-значениями. Он не заменяет if, но в большинстве случаев делает то же самое с меньшими усилиями.