if и when как выражения

Узнаём, что ветвления в Kotlin возвращают значение, а не просто разветвляют код.

Выражение — конструкция, которая вычисляет и возвращает значение; в Kotlin таковыми являются и if, и when.

Во многих языках if и switch — это просто инструкции управления. В Kotlin они ещё и выражения: возвращают результат, который можно присвоить переменной. Это убирает множество промежуточных строк.

if как выражение

Поскольку if возвращает значение, отдельный тернарный оператор ?: (как в Java) Kotlin не нужен.

fun main() {
    val age = 20
    val status = if (age >= 18) "взрослый" else "несовершеннолетний"
    println(status)
}

Вывод:

взрослый

when вместо switch

when — мощная замена switch. Он перебирает варианты и тоже возвращает значение. Ветка else покрывает остальные случаи.

fun main() {
    val day = 3
    val name = when (day) {
        1 -> "Понедельник"
        2 -> "Вторник"
        3 -> "Среда"
        else -> "Другой день"
    }
    println(name)
}

Вывод:

Среда

when с условиями и диапазонами

when можно использовать без аргумента — тогда каждая ветка содержит произвольное логическое условие. Поддерживаются и проверки диапазона через in.

fun grade(score: Int): String = when {
    score >= 90 -> "Отлично"
    score in 70..89 -> "Хорошо"
    score in 50..69 -> "Удовлетворительно"
    else -> "Неудовлетворительно"
}

fun main() {
    println(grade(95))
    println(grade(60))
}

Вывод:

Отлично
Удовлетворительно

Как работает под капотом

Когда when используется как выражение (его результат куда-то присваивается или возвращается), компилятор требует, чтобы были покрыты все возможные случаи — обычно через ветку else. Это гарантирует, что выражение всегда вернёт значение. Если же when применяется как обычная инструкция и результат не используется, else не обязателен.

Частые ошибки

  • Искать тернарный оператор a ? b : c. Его в Kotlin нет — используйте if/else как выражение.
  • Забыть else в when-выражении. Без покрытия всех случаев код не скомпилируется.
  • Городить вложенные if. Часто читабельнее when с условиями в ветках.

Итог

  • if и when возвращают значение — это выражения.
  • when заменяет switch и поддерживает условия и диапазоны (in).
  • В when-выражении нужно покрыть все случаи (обычно через else).
  • Отдельного тернарного оператора в Kotlin нет.
Проверьте себя
1. Почему в Kotlin нет тернарного оператора a ? b : c?
AОн считается устаревшим
Bif сам является выражением и возвращает значение
CЕго заменяет оператор !!
DОн есть, просто пишется иначе
2. Когда when обязан содержать ветку else?
AВсегда
BКогда when используется как выражение (его результат используется)
CНикогда
DТолько при сравнении строк
3. Как проверить, что число попадает в диапазон 70..89 в ветке when?
Ascore == 70..89
Bscore in 70..89
Cscore between 70 and 89
D70 < score < 89