Управлять порядком выполнения программы можно с помощью выражения 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». В ней я нашел все ответы на свой вопрос, за что и благодарен автору статьи… Попробую поискать и почитать его статьи по описанию языка…
online order enclomiphene generic online cheapest
online order enclomiphene buy uk no prescription
kamagra le moins cher
comprar kamagra en usa
order androxal canadian pharmacy no prescription
purchase androxal united kingdom
how to buy dutasteride generic a canada
cheap dutasteride canada price
buy cheap flexeril cyclobenzaprine purchase england
compare prices generic flexeril cyclobenzaprine online without prescription
how to order gabapentin generic switzerland
ordering gabapentin uk online pharmacy
buying fildena cheap fast shipping
how to order fildena canadian online pharmacy
cheap itraconazole generic drug india
buy itraconazole tabs uk
staxyn no script needed cod overnight
get staxyn singapore where to buy
buying avodart australia purchase
buying avodart generic cheap
get rifaximin low cost
discount rifaximin generic order
xifaxan lowest prices
buy cheap xifaxan low price
levné kamagra bez lékařského předpisu
kamagra online bez lékařského předpisu