Avatar ·

Как использовать тернарный оператор в Kotlin? (аналог ?: из Java)

Всем привет! Я только начал изучать Kotlin и перехожу с Java. В Java я часто использовал тернарный оператор для коротких условий, например: ```java int max = (a > b) ? a : b; ``` Но в Kotlin я не могу найти такой синтаксис. Когда я пишу: ```kotlin val max = (a > b) ? a : b ``` Компилятор выдаёт ошибку. Я прочитал, что в Kotlin нет тернарного оператора, но как тогда писать короткие условные выражения? Неужели каждый раз нужно писать полноценный if-else? Мне нужно решить простую задачу: есть переменная `score`, и в зависимости от того, больше ли она 50, я хочу присвоить строку "Pass" или "Fail". В Java я бы написал: ```java String result = (score > 50) ? "Pass" : "Fail"; ``` Как это сделать в Kotlin лаконично и правильно? Заранее спасибо за помощь! <<>>

Почему в 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"
}

Альтернативные подходы

Иногда можно использовать более специфичные конструкции:

  1. Функция takeIf / takeUnless — для проверки одного условия:
// Вернёт "Pass", если score > 50, иначе null
val result = "Pass".takeIf { score > 50 } ?: "Fail"
  1. When-выражение — если условий больше двух:
val grade = when {
    score > 90 -> "A"
    score > 75 -> "B"
    score > 50 -> "C"
    else -> "F"
}
  1. Функции-расширения — для часто используемых шаблонов:
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-стиль!