Выражение when в Kotlin

Выражение when заменяет оператор switch в C-подобных языках. В простейшем виде это выглядит так

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // Обратите внимание на блок
        print("x не равно 1 и не равно 2")
    }
}

when сопоставляет свой аргумент со всеми ветвями последовательно, пока не будет выполнено какое-либо условие ветвления. when может использоваться как выражение или как утверждение. Если оно используется как выражение, значение удовлетворенной ветви становится значением всего выражения. Если он используется как утверждение, значения отдельных ветвей игнорируются. (Как и в случае с if, каждая ветвь может быть блоком, а ее значением является значение последнего выражения в блоке.)

Ветвь else оценивается, если ни одно из других условий ветвления не удовлетворяется. Если when используется в качестве выражения, ветвь else является обязательной, если компилятор не может доказать, что все возможные случаи покрываются условиями ветвления (как, например, с записями класса enum и подтипами sealed класса).

Если во многих случаях нужно обрабатывать таким же образом, условия ветвления могут быть объединены запятой:

when (x) {
    0, 1 -> print("x == 0 или x == 1")
    else -> print("другое")
}

Мы можем использовать произвольные выражения (не только константы) в качестве условий ветвления

when (x) {
    parseInt(s) -> print("s кодирует x")
    else -> print("s не кодирует x")
}

Мы также можем проверить значение на in (вхождение) или !in (не вхождение) в диапазоне или коллекции:

when (x) {
    in 1..10 -> print("x в диапазоне")
    in validNumbers -> print("x валиден")
    !in 10..20 -> print("x вне диапазона")
    else -> print("ничего их вышеперечисленного")
}

Другая возможность - проверить, значение is (принадлежит) или !is (не принадлежит) определенному типу. Обратите внимание, что благодаря интеллектуальному приведению вы можете получить доступ к методам и свойствам типа без каких-либо дополнительных проверок.

fun hasPrefix(x: Any) = when(x) {
    is String -> x.startsWith("prefix")
    else -> false
}

when также можно использовать как замену цепочке if-else if. Если аргумент не указан, условия ветвления представляют собой просто логические выражения, и ветвление выполняется, когда его условие true:

when {
    x.isOdd() -> print("x нечетно")
    y.isEven() -> print("y четно")
    else -> print("x+y нечетно.")
}

Начиная с Kotlin 1.3, можно выполнять захват объекта в переменной, используя следующий синтаксис:

fun Request.getBody() =
        when (val response = executeRequest()) {
            is Success -> response.body
            is HttpError -> throw HttpException(response.status)
        }

Область действия переменной, вводимой в when объекте, ограничивается значением тела when.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Строки в Kotlin

Наследование в Kotlin

Возврат и прыжки в Kotlin