Управлять порядком выполнения программы можно с помощью выражения when
, которое выполняет разный код в зависимости от значения переменной или константы.
Содержание статьи
- Синтаксис выражения when в Kotlin
- Присвоения значения через when
- Продвинутые выражения when в Kotlin
- Задания для проверки
Синтаксис выражения when в Kotlin
Далее представлено выражение when
, которое применяется на целое число:
1 2 3 4 5 6 7 8 | fun main() { val number = 10 when (number) { 0 -> println("Ноль") else -> println("Не-ноль") } } |
Вывод данного примера будет следующим:
1 | Не-ноль |
Цель выражения when
из примера выше в том, что нужно определить, равно ли число нулю или нет. В будущем будут примеры по сложнее — обещаем!
Чтобы обработать конкретный случай, добавляется значение, за которым следует знак ->
, который указывает на код, который будет выполняться, если условие выполнено. Затем используется else, чтобы указать, что должно произойти для всех других значений. В отличие от других языков, таких как Java, в Kotlin нет необходимости включать оператор break в каждую ветвь, поскольку выражение when
будет выполнять только первую совпадающую ветвь.
Далее дан еще один пример:
1 2 3 4 5 6 | fun main() { val number = 10 when (number) { 10 -> println("Это десять!") } } |
На этот раз проверяется если переменная содержит число 10, если это так, то выводится сообщение. Для других значений ничего не должно происходить.
Конечно, выражение when
также работает с другими типами данных, не только с целыми числами. Далее дан пример с использованием строк:
1 2 3 4 5 6 7 | fun main() { val animal = "Собака" when (animal) { "Кот", "Собака" -> println("$animal - Домашнее животное.") else -> println("$animal - Дикое животное.") } } |
Вывод следующий:
1 | Собака - Домашнее животное. |
В этом примере предоставляются два значения для первого аргумента. Это означает, что если значение будет равно "Кот"
или "Собака"
, тогда оператор when выполнит первую ветвь выражения.
Присвоения значения через when
Выражениям when
можно предоставить более одной ветки. Поскольку when
является выражением, его можно использовать для возврата значения, как и выражение if
. Также можно проигнорировать значение, если нужно просто использовать when
в качестве оператора.
Выражение when
вернет значение из первой ветви с соответствующим аргументом.
Если вы хотите вывести номер из константы number
в текстовом формате, то вы можете присвоить значение с помощью выражения when
следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | fun main() { val number = 10 val numberName = when (number) { 2 -> "два" 4 -> "четыре" 6 -> "шесть" 8 -> "восемь" 10 -> "десять" else -> { println("Неизвестный номер") "Неизвестный" } } println(numberName) // Вывод: десять } |
В ветке else
мы использовали фигурные скобки, чтобы включить в ветвь целый блок кода. Последнее значение в блоке возвращается из ветви, поэтому, если number
не было в интервале (2, 4, 6, 8, 10)
, тогда значением в константе numberName
будет "Неизвестный"
.
Продвинутые выражения when в Kotlin
В одном из прошлых уроках мы работали с if выражением, в котором используется несколько условий else
для преобразования времени в строку, описывающую текущею часть дня.
Данную задачу можно переписать лаконично с помощью when
выражения. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | fun main() { val hourOfDay = 12 val timeOfDay: String timeOfDay = when (hourOfDay) { 0, 1, 2, 3, 4, 5 -> "Раннее утро" 6, 7, 8, 9, 10, 11 -> "Утро" 12, 13, 14, 15, 16 -> "После полудня" 17, 18, 19 -> "Вечер" 20, 21, 22, 23 -> "Поздний вечер" else -> "НЕДЕЙСТВИТЕЛЬНЫЙ ЧАС!" } println(timeOfDay) } |
Код выведет следующее:
1 | После полудня |
Помните интервалы? Что ж, вы можете использовать интервалы, чтобы упростить данное when
выражение. Можно переписать приведенный выше код, используя интервалы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | fun main() { val hourOfDay = 12 val timeOfDay = when (hourOfDay) { in 0..5 -> "Раннее утро" in 6..11 -> "Утро" in 12..16 -> "После полудня" in 17..19 -> "Вечер" in 20..23 -> "Поздний вечер" else -> "НЕДЕЙСТВИТЕЛЬНЫЙ ЧАС!" } println(timeOfDay) } |
Это более минималистично и элегантно, чем отдельная запись значений для всех ветвей.
Когда есть несколько ветвей, выражение when выполнит первое соответствующее. Так более сжато и понятно, чем использование if
выражения для данного примера.
Это также более точно, потому что использования if
не обрабатывает отрицательные числа, которые здесь правильно считаются недействительными.
Также можно сопоставить ветвь с условием на основе свойства значения без каких-либо аргументов, передаваемых выражению when
.
Является ли целое число четным или нечетным
Для определения является ли целое число четным или нечетным, можно использовать оператор %
для нахождения остатка от деления.
Рассмотрим следующий код:
1 2 3 4 5 6 7 | fun main() { val number = 10 when { number % 2 == 0 -> println("Четный") else -> println("Нечетный") } } |
Результат следующий:
1 | Четный |
Первая ветвь данного when
выражения использует оператор ==
. Это означает, что аргумент будет совпадать только тогда, когда определенное условие истинно.
В данном примере аргумент был создан таким образом, чтобы он совпадал, если значение четное, то есть если значение остатка после деления на 2 равно 0.
Другой пример более эффективного использования условий в when
выражениях:
1 2 3 4 5 6 7 8 9 10 11 12 13 | fun main() { val x = 0 val y = 0 val z = 0 when { x == 0 && y == 0 && z == 0 -> println("Точка начала") y == 0 && z == 0 -> println("Координата находится на оси x, где x = $x") x == 0 && z == 0 -> println("Координата находится на оси y, где y = $y") x == 0 && y == 0 -> println("Координата находится на оси z, где z = $z") else -> println("Где-то в пространстве где x = $x, y = $y, z = $z") } } |
Что делает каждая из ветвей по порядку:
- Выполняется если значения из x, y, z равны
(0, 0, 0)
. Это координаты точки в 3D пространстве; - Выполняется если
y
= 0,z
= 0 и значениеx
содержит любое другое значение. Это означает, что координата находится на осиx
; - Выполняется если
x
= 0,z
= 0 и значениеy
содержит любое другое значение. Это означает, что координата находится на осиy
; - Выполняется если
x
= 0,y
= 0 и значениеz
содержит любое другое значение. Это означает, что координата находится на осиz
; - Выполняется если данные из каждой координаты разные.
Последняя ветвь с условием else
используется по умолчанию. Она соответствует чему угодно, потому что нет ограничений ни на одну часть координат. Вот пример более сложного случая:
1 2 3 4 5 6 7 8 9 | fun main() { val x = 0 val y = 0 when { x == y -> println("Вдоль линии Y равен X.") y == x * x -> println("Вдоль линии Y = X^2.") } } |
Здесь сопоставляются строки “y равен x”
и “y равен x в квадрате”
. Поскольку у выражения when
нет аргумента, вам не нужна ветвь else
, а выражение when
не будет выполнять ветвь, если нет соответствующего условия. Это основы выражений when
!
Задания для проверки
Напишите when
выражение, которое принимает возраст как целое число и выводит стадию жизни, относящуюся к данному возрасту. Вы можете создать свои этапы жизни или использовать нашу классификацию:
- 0-2 года Младенец (Infant);
- 3-12 лет, Ребенок (Child);
- 13-19 лет, Подросток (Teenager);
- 20-39, Взрослый (Adult);
- 40-60 лет, Средний возраст (Middle aged);
- 61+, Пожилые (Elderly).
Напишите when
выражение, которое разбивает тип Pair, содержащую строку и целое число. Строка это имя, а целое число — возраст человека. Используйте те же случаи, которые вы использовали в предыдущем упражнении, чтобы вывести имя, за которым следует этап жизни. Например, "Иван взрослый."
Статью обнаружил случайно во время поиска «формата оператора when языка Kotlin». В ней я нашел все ответы на свой вопрос, за что и благодарен автору статьи… Попробую поискать и почитать его статьи по описанию языка…