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

Условное выражение 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 or !is проверить тип аргумента. Обратите внимание, что благодаря smart casts, вы можете получить доступ к методам и свойствам типа без дополнительной проверки.

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 and do..while работают как обычно:

while (x > 0) {
  x--
}

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

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

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

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