Как использовать тернарный оператор в Kotlin? (аналог ?: из Java)
Почему в Kotlin нет тернарного оператора?
Kotlin намеренно отказался от классического тернарного оператора ?: (condition ? trueValue : falseValue) из Java/JavaScript. Причина в том, что в Kotlin if сам является выражением, а не оператором — он может возвращать значение. Это делает отдельный тернарный оператор избыточным.
Основное решение: используйте if как выражение
В Kotlin конструкция if может возвращать результат, поэтому ваш код превращается в:
val result = if (score > 50) "Pass" else "Fail"
Это работает точно так же, как тернарный оператор, но выглядит чище и читаемее. Вы можете использовать это в любом месте, где ожидается значение:
// Присваивание
val max = if (a > b) a else b
// Возврат из функции
fun getGrade(score: Int): String = if (score > 50) "Pass" else "Fail"
// Внутри лямбды
val list = listOf(1, 2, 3).map { if (it > 2) "big" else "small" }
// В строковой интерполяции
println("Результат: ${if (score > 50) "успех" else "неудача"}")
Когда использовать if-else?
- Для коротких условий (2-3 ветки) — идеально, как показано выше.
- Для длинных условий — разбивайте на несколько строк для читаемости.
- Когда нужно выполнить побочные действия — if остаётся выражением, но вы можете добавить блоки:
val result = if (score > 50) {
println("Поздравляем!")
"Pass"
} else {
println("Попробуйте ещё раз")
"Fail"
}
Альтернативные подходы
Иногда можно использовать более специфичные конструкции:
- Функция
takeIf/takeUnless— для проверки одного условия:
// Вернёт "Pass", если score > 50, иначе null
val result = "Pass".takeIf { score > 50 } ?: "Fail"
- When-выражение — если условий больше двух:
val grade = when {
score > 90 -> "A"
score > 75 -> "B"
score > 50 -> "C"
else -> "F"
}
- Функции-расширения — для часто используемых шаблонов:
inline fun <T> T?.orElse(default: T): T = this ?: default
// Использование
val result = (score > 50).let { if (it) "Pass" else "Fail" }
Важные замечания
- Тип результата — обе ветки if должны возвращать совместимые типы (или быть Unit).
- Производительность — if-выражение компилируется в те же байт-коды, что и тернарный оператор в Java. Разницы нет.
- Читаемость — команда JetBrains сознательно выбрала if-else вместо ?: для улучшения читаемости кода.
Итог
В Kotlin просто пишите if (condition) value1 else value2 вместо condition ? value1 : value2. Это не менее лаконично, но более наглядно и соответствует философии языка — минимум синтаксического сахара, максимум ясности. Привыкните к этому стилю, и вы заметите, что код становится более понятным, особенно при вложенных условиях.
Дополнительный совет: используйте when для множественных условий
Хотя if-выражение отлично заменяет тернарный оператор, в Kotlin есть ещё один мощный инструмент — when. Он особенно удобен, когда у вас больше двух вариантов или проверяемое значение сравнивается с несколькими константами.
Пример с вашей задачей (но с расширенной логикой):
val result = when {
score > 90 -> "Отлично"
score > 75 -> "Хорошо"
score > 50 -> "Сдано"
else -> "Не сдано"
}
Если нужно проверить конкретное значение (а не диапазон):
val status = when (score) {
100 -> "Идеально"
0 -> "Пусто"
in 1..49 -> "Низкий"
else -> "Средний"
}
Запомните: в Kotlin if и when — это выражения, возвращающие значения. Это полностью заменяет тернарный оператор и делает код более гибким. Привыкайте использовать их — это идиоматичный Kotlin-стиль!