Skip to content

Latest commit

 

History

History
193 lines (139 loc) · 8.54 KB

control-flow.md

File metadata and controls

193 lines (139 loc) · 8.54 KB
type layout category title url
doc
reference
Syntax
Управляющие инструкции

Управляющие инструкции

Условное выражение if

В языке 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

Ключевое слово 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 обеспечивает перебор всех значений, поставляемых итератором. Для этого используется следующий синтаксис:

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

Ключевые слова while и do..while работают как обычно:

while (x > 0) {
  x--
}

do {
  val y = retrieveData()
} while (y != null) // y is visible here!

См. использование while.

Ключевые слова break и continue в циклах

Kotlin поддерживает обычные операторы break и continue в циклах. См. Операторы перехода.