Поиск…


замечания

В отличие от switch Java, оператор when не имеет никакого сквозного поведения. Это означает, что если ветвь согласована, поток управления возвращается после его выполнения, и оператор break не требуется. Если вы хотите объединить bahaviors для нескольких аргументов, вы можете написать несколько аргументов, разделенных запятыми:

when (x) {
    "foo", "bar" -> println("either foo or bar")
    else -> println("didn't match anything")
}

Стандартный if-statement

val str = "Hello!"
if (str.length == 0) {
    print("The string is empty!")
} else if (str.length > 5) {
    print("The string is short!")
} else {
    print("The string is long!")
}

В противном случае else-ветви являются необязательными в нормальных операторах if.

Оператор if в качестве выражения

Операторы if могут быть выражениями:

val str = if (condition) "Condition met!" else "Condition not met!"

Обратите внимание, что else -branch не является необязательным, если if -statement используется как выражение.

Это также можно сделать с помощью многострочного варианта с фигурными скобками и несколькими else if .

val str = if (condition1){
    "Condition1 met!" 
   } else if (condition2) {
    "Condition2 met!" 
   } else {
    "Conditions not met!"
   }

СОВЕТ: Kotlin может вывести тип переменной для вас, но если вы хотите быть уверенным в типе, просто комментируйте его по переменной, как: val str: String = это обеспечит соблюдение типа и упростит его чтение.

Оператор when вместо цепочек if-else-if

Оператор while является альтернативой if-statement с несколькими else-if-ветвями:

when {
    str.length == 0 -> print("The string is empty!")
    str.length > 5  -> print("The string is short!")
    else            -> print("The string is long!")
}

Тот же код, написанный с использованием цепочки if-else-if :

if (str.length == 0) {
    print("The string is empty!")
} else if (str.length > 5) {
    print("The string is short!")
} else {
    print("The string is long!")
}

Как и в случае if-statement, else-branch является необязательным, и вы можете добавить столько или несколько ветвей, сколько хотите. Вы также можете иметь многострочные ветви:

when {
    condition -> {
        doSomething()
        doSomeMore()
    }
    else -> doSomethingElse()
}

Согласование аргументов-оператора

При задании аргумента, when -statement соответствует аргументу против ветвей в последовательности. Согласование выполняется с помощью оператора == который выполняет нулевые проверки и сравнивает операнды с помощью функции equals . Первый соответствующий будет выполнен.

when (x) {
    "English" -> print("How are you?")
    "German" -> print("Wie geht es dir?")
    else -> print("I don't know that language yet :(")
}

Оператор when также знает некоторые дополнительные варианты соответствия:

val names = listOf("John", "Sarah", "Tim", "Maggie")
when (x) {
    in names -> print("I know that name!")
    !in 1..10 -> print("Argument was not in the range from 1 to 10")
    is String -> print(x.length) // Due to smart casting, you can use String-functions here
}

Когда выражение-выражение как выражение

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

val greeting = when (x) {
    "English" -> "How are you?"
    "German" -> "Wie geht es dir?"
    else -> "I don't know that language yet :("
}
print(greeting)

Чтобы использоваться как выражение, оператор when должен быть исчерпывающим, то есть иметь либо ветку else или покрывать все возможности ветвями по-другому.

Когда-заявление с перечислениями

when их можно использовать для соответствия значениям enum :

enum class Day {
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
}

fun doOnDay(day: Day) {
    when(day) {
        Day.Sunday ->     // Do something
        Day.Monday, Day.Tuesday ->     // Do other thing
        Day.Wednesday ->  // ...
        Day.Thursday ->   // ...
        Day.Friday ->     // ...
        Day.Saturday ->   // ...
    }
}

Как вы можете видеть во второй строке ( Monday и Tuedsay ), также возможно объединить два или более значений enum .

Если ваши случаи не являются исчерпывающими, компиляция покажет ошибку. Вы можете использовать else для обработки случаев по умолчанию:

fun doOnDay(day: Day) {
    when(day) {
        Day.Monday ->     // Work
        Day.Tuesday ->    // Work hard
        Day.Wednesday ->  // ...
        Day.Thursday ->   //
        Day.Friday ->     //
        else ->           // Party on weekend
    }
} 

Хотя то же самое можно сделать, используя конструкцию if-then-else , when берет на себя недостающие значения enum и делает ее более естественной.

Проверьте здесь дополнительную информацию о kotlin enum



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow