Назад к вопросам
Junior
113
questionbank

Как работает конструкция when в языке Kotlin?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Конструкция when в Kotlin является гибкой заменой оператора switch в других языках. Она позволяет сопоставлять значение с различными ветками (conditions) и выполнять соответствующий блок кода. when может использоваться либо как выражение (возвращает значение последней строки выполненной ветки), либо как оператор (просто выполняет код).

Основные возможности:

  • Сопоставление константных значений: Проверка на равенство с литералами, константами или другими неизменяемыми значениями.

    // Пример сопоставления констант
    fun describe(obj: Any): String =
        when (obj) {
            1           -> "One"
            "Hello"     -> "Greeting"
            is Long     -> "Long"
            !is String  -> "Not a string"
            else        -> "Unknown"
        }
    
  • Сопоставление по типам (is, !is): Проверка, является ли объект экземпляром определенного типа (или не является им). В случае успешного сопоставления, переменная в ветке автоматически приводится к указанному типу (смарт-каст).

  • Сопоставление по диапазонам и коллекциям (in, !in): Проверка, находится ли значение в заданном диапазоне или коллекции.

    // Пример сопоставления по диапазону
    fun isHot(temperature: Int): Boolean =
        when (temperature) {
            in 30..100 -> true
            else       -> false
        }
    
  • Несколько условий в одной ветке: Несколько выражений могут быть объединены запятыми в одной ветке. Если хотя бы одно из выражений истинно, ветка выполняется.

    // Пример нескольких условий в одной ветке
    fun getColorName(rgb: Int): String =
        when (rgb) {
            0xFF0000, 0xFF0001, 0xFF0002 -> "Red variant"
            0x00FF00                   -> "Green"
            0x0000FF                   -> "Blue"
            else                       -> "Unknown"
        }
    
  • Использование произвольных выражений: Каждая ветка может содержать произвольное булево выражение.

    // Пример с произвольными выражениями
    fun evaluate(score: Int): String =
        when {
            score >= 90 -> "Excellent"
            score >= 75 -> "Good"
            score >= 60 -> "Satisfactory"
            else       -> "Poor"
        }
    

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

  • Ветка else: Ветку else следует использовать для обработки всех остальных случаев, которые не были покрыты предыдущими ветками. Она обязательна, если when используется как выражение, и компилятор не может доказать, что все возможные случаи были обработаны.

  • Порядок выполнения: Ветки проверяются последовательно сверху вниз. Как только найдена первая соответствующая ветка, ее код выполняется, и when завершает работу (или возвращает значение).

Конструкция when более выразительна и безопасна по сравнению с традиционным switch, так как поддерживает более сложные условия и требует обработки всех возможных случаев (или использования else), что предотвращает потенциальные ошибки.