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 нет.