Уроки по Kotlin - Циклы, for, while

kotlin

Циклы (Loops) - это чуть-ли не самая используемая функциональность в любом языке программирования, поэтому крайне важно понимать, как работать с циклами в конкретном языке. Kotlin предоставляет очень богатый функционал для эффективной работы с таким циклами, как for и while, который значительно богаче чем в Java.

Для того, что-бы лучше понять циклы, рекомендую сперва прочитать статью про массивы.

Цикл For

Начнем с простого примера, пройдемся по числам от 0 до 10.

for(index in 0..10) {
    // выполнится 11 раз
    println("index = $index")
}

Функция println выполнится 11 раз. Потому, что обход начинается с 0-ля и заканчивается на 10, включая 10-ку. Для того, что-бы 10-ку не включать, необходимо использовать ключевое слово until, вместо двух точек.

for(index in 0 until 10) {
    // выполнится 10 раз
    println("index = $index")
}

Попробуй те выполнить это самостоятельно у себя на компьютере. Это очень важно, иначе для вас эта статься пролетит мимо.

Если вам необходимо сделать обход в обратном направлении, то необходимо использовать ключевое слово downTo.

for(index in 10 downTo 0) {
    // выполнение в обратную сторону
    println("index = $index")
}

А еще, ко всем видам обхода можно добавить ключевое слово step. В этом случае можно делать обход через заданное количество индексов

for(index in 0 until 10 step 2) {
    // выполнится 5 раз (через каждые 2)
    println("index = $index")
}

Естественно все это можно применить к реальным массивам, например вот так:

val arrayText = arrayOf("Kiparo", "the", "best")

for(index in 0 until arrayText.size) {
    println("index = $index, value = ${arrayText[index]}")
}

Догадались почему мы используем until, а не две точки?. Если нет, то запустить такой же код с двумя точками и посмотрите, что вышло ;).

Но, в Kotlin создали еще более удобный вариант работы с циклами. Именно такие варианты рекомендованы к использованию:

val arrayText = arrayOf("Kiparo", "the", "best")

for(value in arrayText) {
    // распечатает значение каждой ячейки в массиве
    println("value = $value")
}

for(index in arrayText.indices) {
    // получаем индексы
    println("index = $index, value = ${arrayText[index]}")
}

for((index, value) in arrayText.withIndex()) {
    // а вот тут, получаем и индексы и значение
    println("index = $index, value = $value")
}

C циклами также удобно использовать continue и break.

  • continue - можно вставлять внутрь цикла, данное ключевое слово прекращает выполнение текущей итерации и переходит на следующую итерацию
  • break - полностью прекращает текущий цикл.
val arrayText = arrayOf("Kiparo", "the", "best")

for(value in arrayText) {

    if(value == "the") {
        continue;
    }

    if(value == "best") {
        break;
    }
    
    println("value = $value")
}

В примере, если содержимое ячейки равно "the" мы перейдем на следующую итерацию и до println не дойдем, а вот если содержимое ячейки равно "best", то выполнение цикла прекратится. Операторы break и continue влияют на тот цикл, в котором вы его вызвали. Если же необходимо повлиять на цикл, который находится выше, например если у вас много вложенных циклов, то можно применить вот такой метод:

val arrayText = arrayOf("Kiparo", "the", "best")

mainLoop@ for(value in arrayText) {
    for(index in 0..10) {
        if(index == 5) {
            continue@mainLoop;
        }
    }
}

В итоге, если индекс в внутреннем цикле будет равен 5, то мы прекратим выполнение текущего цикла и перейдем на следующую итерацию в внешнем цикле.

Цикл While

Цикл while крайне простой, его работа аналогична другим языкам.

while (x > 0) {
    // выполняется до тек пор пока выражение x > 0 выдает true
    println("Hello")
}

do {
    // сначала выполниться один раз, а затем пока выражение = true
    println("Hello")
} while (x > 0) 

Обновлено 29 марта 2021

Теги:

"Сайт использует cookie-файлы для того, чтобы вам было удобнее им пользоваться. Для продолжения работы с сайтом, вам необходимо принять использование cookie-файлов."