type | layout | category | title | url |
---|---|---|---|---|
doc |
reference |
Syntax |
Управляющие инструкции |
В языке Kotlin ключевое слово if является выражением, т.е. оно возвращает значение. Это позволяет отказаться от тернарного оператора (условие ? условие истинно : условие ложно), поскольку выражению if вполне по силам его заменить.
// обычное использование
var max = a
if (a < b)
max = b
// с блоком else
var max: Int
if (a > b)
max = a
else
max = b
// в виде выражения
val max = if (a > b) a else b
"Ветви" выражения if могут содержать несколько строк кода, при этом последнее выражение является значением блока:
val max = if (a > b) {
print("возвращаем a")
a
}
else {
print("возвращаем b")
b
}
Если вы используете конструкцию if в качестве выражения (например, возвращая его значение или присваивая его переменной), то использование ветки else
является обязательным.
См. использование if.
Ключевое слово when призвано заменить оператор switch, присутствующий в C-подобных языках. В простейшем виде его использование выглядит так:
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // обратите внимание на блок
print("x is neither 1 nor 2")
}
}
Выражение when последовательно сравнивает аргумент со всеми указанными значениями до удовлетворения одного из условий. when можно использовать и как выражение, и как оператор. При использовании в виде выражения значение ветки, удовлетворяющей условию, становится значением всего выражения. При использовании в виде оператора значения отдельных веток отбрасываются. (В точности как if: каждая ветвь может быть блоком и её значением является значение последнего выражения блока.)
Значение ветки else вычисляется в том случае, когда ни одно из условий в других ветках не удовлетворено. Если when используется как выражение, то ветка else является обязательной, за исключением случаев, в которых компилятор может убедиться, что ветки покрывают все возможные значения.
Если для нескольких значений выполняется одно и то же действие, то условия можно перечислять в одной ветке через запятую:
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
Помимо констант в ветках можно использовать произвольные выражения:
when (x) {
parseInt(s) -> print("s encodes x")
else -> print("s does not encode x")
}
Также можно проверять вхождение аргумента в интервал in или !in или его наличие в коллекции:
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
Помимо этого Кotlin позволяет с момощью is или !is проверить тип аргумента. Обратите внимание, что благодаря умным приведениям вы можете получить доступ к методам и свойствам типа без дополнительной проверки:
val hasPrefix = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
when удобно использовать вместо цепочки условий вида if-else if. При отстутствии аргумента условия работают как простые логические выражения, а тело ветки выполняется при его истинности:
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}
См. использование when.
Цикл for обеспечивает перебор всех значений, поставляемых итератором. Для этого используется следующий синтаксис:
for (item in collection)
print(item)
Телом цикла может быть блок кода:
for (item: Int in ints) {
// ...
}
Как отмечено выше, цикл for позволяет проходить по всем элементам объекта, имеющего итератор, например:
- обладающего внутренней или внешней функцией
iterator()
, возвращаемый тип которой- обладает внутренней или внешней функцией
next()
, и - обладает внутренней или внешней функцией
hasNext()
, возвращающейBoolean
.
- обладает внутренней или внешней функцией
Все три указанные функции должны быть объявлены как operator
.
Если при проходе по массиву или списку необходим порядковый номер элемента, используйте следующий подход:
for (i in array.indices)
print(array[i])
Обратите внимание, что данная "итерация по ряду" компилируется в более производительный код без создания дополнительных объектов.
Также вы можете использовать библиотечную функцию withIndex
:
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
См. использование for.
Ключевые слова while и do..while работают как обычно:
while (x > 0) {
x--
}
do {
val y = retrieveData()
} while (y != null) // y is visible here!
См. использование while.
Kotlin поддерживает обычные операторы break и continue в циклах. См. Операторы перехода.