Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое оператор when в Kotlin?
Оператор when — это мощный и гибкий конструктор ветвления (условный оператор) в языке Kotlin, который служит заменой традиционного оператора switch, встречающегося в таких языках, как Java или C++. Однако его возможности значительно расширены: он может работать не только с простыми значениями, но также с диапазонами, типами данных, произвольными условиями и даже выполнять роль выражения (expression), возвращающего значение.
Основные формы использования
1. when как замена switch (простой выбор по значению)
В своей базовой форме он сравнивает аргумент с набором возможных значений.
fun describeNumber(number: Int): String {
when (number) {
1 -> return "Единица"
2 -> return "Двойка"
3 -> return "Тройка"
else -> return "Неизвестное число"
}
}
2. when как выражение (возвращает значение)
Если when используется как выражение, последняя ветка каждого условия становится его результатом. При этом наличие ветки else в таком случае обязательно, если компилятор не может гарантировать покрытие всех возможных случаев.
fun describeNumber(number: Int): String = when (number) {
1 -> "Единица"
2 -> "Двойка"
3 -> "Тройка"
else -> "Неизвестное число"
}
3. Проверка на принадлежность диапазону или коллекции
Оператор поддерживает проверку с помощью ключевого слова in.
when (x) {
in 1..10 -> println("x в диапазоне от 1 до 10")
in listOf(11, 12, 13) -> println("x равен 11, 12 или 13")
!in 20..30 -> println("x НЕ в диапазоне от 20 до 30")
else -> println("другой вариант")
}
4. Проверка типа (Smart Cast)
Это одна из самых мощных особенностей when в сочетании с системой типов Kotlin. Используя ключевое слово is, можно не только проверить тип, но и автоматически (smart cast) привести объект к этому типу внутри соответствующей ветки.
fun processObject(obj: Any) {
when (obj) {
is String -> println("Это строка длиной ${obj.length}") // obj автоматически приведен к String
is Int -> println("Это целое число. Удвоенное значение: ${obj * 2}")
is List<*> -> println("Это список размером ${obj.size}")
else -> println("Неизвестный тип")
}
}
5. when без аргумента (как набор логических условий)
В этой форме when не принимает аргумента, а каждое условие в ветках является независимым логическим выражением. Это превращает его в альтернативу сложным цепочкам if-else if.
when {
x > 0 && y > 0 -> println("Точка в первой четверти")
x < 0 && y > 0 -> println("Точка во второй четверти")
x.isNaN() -> println("x не является числом")
else -> println("Другое положение")
}
Преимущества when перед switch из Java
- Многообразие условий: Не только равенство (
==), но и диапазоны (in), типы (is), произвольные логические выражения. - Работа с любыми типами: В Java
switchработал только с примитивами,StringиEnum. Kotlinwhenможет использовать любой тип. - Отсутствие необходимости в
break: В Kotlin нет "проваливания" (fall-through) из одной ветки в другую, что устраняет частую ошибку в Java. - Возможность быть выражением: Прямое возвращение значения делает код более лаконичным и читаемым.
- Умное приведение типов (Smart Cast): Значительное сокращение явных проверок и приведений.
Особенности и важные моменты
- Порядок проверки: Ветки оцениваются последовательно сверху вниз. Первое совпавшее условие определяет выполнение соответствующего блока кода.
- Обязательность
else: В форме выраженияelseобязательна, если компилятор не может доказать, что все возможные случаи покрыты (например, при проверке типаsealed classилиenum). - Комбинация условий: В одной ветке можно объединить несколько условий через запятую.
when (value) {
0, 1 -> println("Значение 0 или 1") // Комбинация значений
is String, is Char -> println("Это текст или символ") // Комбинация типов
}
В итоге, оператор when является центральным и чрезвычайно выразительным инструментом для управления потоком выполнения в Kotlin, который благодаря своей гибкости и безопасности активно используется в разработке Android приложений для обработки различных состояний, типов данных и сложных логических условий.