Глиф Учебники

Урок 4. Условия if и when

Курс «Kotlin» · урок 4 из 10 · 4 минуты чтения

До сих пор программы выполняли все строки по порядку. Но часто нужно выбрать: если число отрицательное — одно действие, иначе — другое. Для этого в Kotlin есть if и when.

if и else

Kotlin
fun main() {
    val t = readln().toInt()
    if (t < 0) {
        println("Frost")
    } else if (t < 15) {
        println("Cool")
    } else {
        println("Warm")
    }
}
Ввод
7
Вывод
Cool

Как это читается:

Проверки идут сверху вниз, и выполняется только первый подходящий блок. При t = 7 первое условие 7 < 0 неверно, второе 7 < 15 верно — выводится Cool, а до else дело не доходит.

t = 7 if (t < 0) 7 < 0 — неверно нет else if (t < 15) 7 < 15 — верно да Cool да Frost нет else не проверяется Warm
При t = 7 условие t < 0 неверно, t < 15 верно — выполняется блок с Cool, а ветка else уже не проверяется.

Если в блоке одна команда, фигурные скобки можно опустить: if (t < 0) println("Frost"). Но со скобками меньше ошибок, когда команд потом становится больше.

Сравнения

ЗнакЗначение
==равно
!=не равно
<, >меньше, больше
<=, >=меньше или равно, больше или равно

Сравнение — тоже значение: 5 > 3 — это true, его можно положить в переменную типа Boolean.

Строки сравниваются тем же ==, и сравнивается их текст: answer == "yes". В Java для этого нужен был equals, в Kotlin — нет. Сравнить без учёта больших и маленьких букв: answer.equals("yes", ignoreCase = true).

Одиночный = — присваивание, а не сравнение. Строка if (x = 5) в Kotlin не соберётся, так что эту ошибку компилятор поймает сам.

И, или, не

Условия соединяют логическими операциями:

Kotlin
fun main() {
    val year = 2024
    val leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0
    println(leap)
    val age = 15
    if (age >= 7 && age <= 17) {
        println("School age")
    }
    if (!leap) {
        println("Not a leap year")
    }
}
Вывод
true
School age

Год високосный, если делится на 4, но не на 100, — или если делится на 400. 2024 делится на 4 и не делится на 100, поэтому leap — true, и последняя строка не выводится.

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

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

Kotlin
fun main() {
    val a = 12
    val b = 30
    val max = if (a > b) a else b
    println(max)
    val parity = if (a % 2 == 0) "even" else "odd"
    println("$a is $parity")
}
Вывод
30
12 is even

Тернарного оператора условие ? a : b, как в Java и C, в Kotlin нет — его место занимает if. Когда if даёт значение, ветка else обязательна: иначе непонятно, что положить в переменную.

val a = 12 val b = 30 val max = if (a > b) a else b 12 > 30 false условие да нет a → 12 b → 30 ветка else max 30 значение if — в переменную
Выражение if (a > b) a else b: условие 12 > 30 неверно, поэтому значение даёт ветка else, и в max попадает 30.

when

Когда вариантов много, цепочка else if становится длинной. Вместо неё удобен when — он сравнивает значение с вариантами по очереди:

Kotlin
fun main() {
    val day = 6
    val name = when (day) {
        1 -> "Monday"
        2 -> "Tuesday"
        3 -> "Wednesday"
        4 -> "Thursday"
        5 -> "Friday"
        6, 7 -> "Weekend"
        else -> "No such day"
    }
    println(name)
}
Вывод
Weekend

Вариантом может быть диапазон — in 90..100 значит «от 90 до 100 включительно» (о диапазонах — в следующем уроке):

Kotlin
fun main() {
    val score = 87
    val grade = when (score) {
        in 90..100 -> "A"
        in 75..89 -> "B"
        in 60..74 -> "C"
        else -> "F"
    }
    println(grade)
}
Вывод
B
val score = 87 87 else -> "F" in 60..74 -> "C" in 75..89 -> "B" in 90..100 -> "A" всё остальное grade = "B"
Значение score = 87 попадает в диапазон in 75..89, поэтому when даёт "B"; что не входит ни в один диапазон, уходит в else и получает "F".

when без значения

Если после when не писать значение в скобках, в каждой ветке стоит своё условие — получается аккуратная замена цепочки if – else if:

Kotlin
fun main() {
    val x = -5
    when {
        x > 0 -> println("positive")
        x < 0 -> println("negative")
        else -> println("zero")
    }
}
Вывод
negative

Здесь when не возвращает значение, а выполняет действие, поэтому else мог бы и не стоять. Ветки проверяются сверху вниз, выполняется первая подходящая.

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

Коротко

Проверьте себя

1. Как в Kotlin записать «больший из a и b» одной строкой?
2. Что выведет программа?
Kotlin
fun main() {
    val n = 15
    when {
        n % 15 == 0 -> println("FizzBuzz")
        n % 3 == 0 -> println("Fizz")
        n % 5 == 0 -> println("Buzz")
        else -> println(n)
    }
}
3. Когда условие a > 0 || b > 0 верно?
4. Как проверить, что строка answer равна "yes"?