Как использовать тернарный оператор в Kotlin? Аналог ? : из Java
В Kotlin нет тернарного оператора, но есть лучшее решение
Действительно, в Kotlin отсутствует классический тернарный оператор ? : из Java, C или JavaScript. Это сделано намеренно. Вместо него Kotlin предлагает более гибкий и читаемый подход — использование if как выражения.
Почему if — это выражение?
В Kotlin if может возвращать значение, в отличие от Java, где if — это только инструкция (statement). Это значит, что вы можете писать:
val max = if (a > b) a else b
Это не просто замена тернарного оператора — это более мощная конструкция. Вы можете использовать блоки кода внутри каждой ветки:
val result = if (condition) {
println("Выполняется условие")
calculateSomething()
} else {
println("Условие не выполнено")
calculateSomethingElse()
}
Последнее выражение в каждом блоке становится возвращаемым значением.
Элегантная альтернатива: функция takeIf
Для простых случаев проверки одного значения можно использовать функцию-расширение takeIf:
val max = a.takeIf { it > b } ?: b
Здесь takeIf возвращает a, если условие истинно, иначе null. Оператор ?: (Элвис) подставляет значение по умолчанию b.
Использование when для множественных условий
Если у вас несколько условий, when заменяет не только тернарный оператор, но и switch:
val grade = when {
score >= 90 -> "A"
score >= 80 -> "B"
score >= 70 -> "C"
else -> "F"
}
Практические примеры
- Простое присваивание:
val isAdult = if (age >= 18) "Да" else "Нет" - Вложенные условия:
val category = if (x > 0) "Положительное" else if (x < 0) "Отрицательное" else "Ноль" - С коллекциями:
val firstPositive = numbers.firstOrNull { it > 0 } ?: -1
Почему это лучше тернарного оператора?
- Читаемость:
if (a > b) a else bчитается как обычное предложение на английском. - Гибкость: Можно добавлять блоки кода, логирование, несколько операций.
- Безопасность: Нет путаницы с приоритетами операторов, как в Java (например,
a ? b : c ? d : e). - Единообразие: В Kotlin все управляющие конструкции (
if,when,try) могут быть выражениями.
Таким образом, хотя синтаксис может показаться непривычным, на практике if как выражение оказывается более удобным и мощным инструментом, чем тернарный оператор. Попробуйте использовать его в своих проектах — вы быстро привыкнете!
Альтернативный подход: использование функций высшего порядка
Если вам не хватает лаконичности, можно создать свою функцию-расширение, имитирующую тернарный оператор:
infix fun <T> Boolean.then(value: T): T? = if (this) value else null
infix fun <T> T?.orElse(value: T): T = this ?: value
// Использование:
val max = (a > b) then a orElse b
Однако я не рекомендую этот подход в production-коде. Он нарушает принцип наименьшего удивления и создаёт неочевидный код для других разработчиков.
Практический совет для начинающих
Лучший способ — принять философию Kotlin. Используйте if как выражение для простых случаев и when для сложных. Это сделает ваш код более идиоматичным и понятным для других Kotlin-разработчиков.
Если вы работаете с nullable-значениями, оператор Элвис ?: отлично справляется с задачей "если не null, то иначе":
val name = nullableName ?: "Гость"
Это гораздо лаконичнее, чем тернарный оператор с проверкой на null.
Ответов пока нет.
Войдите чтобы оставить ответ