Что такое 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, но в большинстве случаев делает то же самое с меньшими усилиями.