Как работает конструкция 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), что предотвращает потенциальные ошибки.