Kotlin
Условные заявления
Поиск…
замечания
В отличие от 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