← Назад к вопросам

Что такое оператор when?

1.3 Junior🔥 171 комментариев
#Kotlin основы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое оператор 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. Kotlin when может использовать любой тип.
  • Отсутствие необходимости в 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 приложений для обработки различных состояний, типов данных и сложных логических условий.