Циклы повторяют выполнение одного и того же блока кода несколько раз пока не наступает условие выхода из цикла. Условием выхода является булево значение: достижение конца коллекции, наступление конца диапазона, отсутствие следующего объекта итератора и т.д.
Итерация цикла – каждое повторение кода в теле цикла.
Итератор – объект, который позволяет получить последовательный доступ к элементам коллекции.
Цикл for итерирует что-угодно, что имеет итератор. Допустимы объекты к итератору которых можно получить доступ посредством вызова функции iterator(), в котором есть функции next и hasNext, которые возвращают булевы значения: true или false.
Получение один за другим элементов коллекции:
for (item in collection) {
// Выполнить какой-либо код
}
Итерация по диапазону чисел:
for (i in 0.10) {
println(i) // В каждом повторе цикла выводит значение начиная от 0, 1, 2 …. 10
}
for (i in 10 downTo 0 step 2) {
println(i) // Значение i вначале равно 10 затем в каждой итерации цикла оно уменьшается на 2 до достижения значения 0
}
Итерацию можно проводить посредством индексов массива, так как свойство indices массива имеет тип IntRange, что представляет собой диапазон значений от 0 до последнего индекса массива:
for (i in array.indices) {
println(array[i])
}
Цикл while получает один параметр типа Boolean и пока значение этого параметра true цикл продолжает выполнение.
В примере ниже цикл повторяется 10 раз печатая значения начиная от 0 до 10. 10 не выводится, так как условие выполнение цикла становится false, так как проверка 10 < 10 равно false (10 не может быть меньше 10)
var x = 0
while (x < 10) {
println(x)
x++ // Увеличивает значение на 1
}
Цикл do-while выполняется по крайней мере один раз, так как сначала выполняется блок do, а затем уже проверяется условие посредством while, который также получает параметр типа Boolean.
На примере использования итератора массива видно, что значением, которое проверяется в while является булево значение, которое возвращает true пока есть следующий объект в массиве и возвращает false, когда в блоке do получаем доступ к последнему элементу и выводим его в консоль:
val array = arrayOf<Int>(1, 2, 3, 4, 5)
val iter = array.iterator()
do {
println(iter.next())
} while (iter.hasNext())
Циклы можно прерывать досрочно, используя оператор break.
На примере ниже показано, как при достижении значения 4 выполнение цикла прерывается и код продолжает своё выполнение начиная со строки после цикла:
for(i in 0..10) {
println(i)
if (i == 3) break // На заметку. Если в теле используется только одна строка кода, блок открывать необязательно
}
Для пропуска итерации цикла можно использовать оператор continue.
В примере ниже цикл выводит только нечетные значения, так как при присвоении четного значения переменной i проверяется четность путём расчёта остатка от деления и если оно равно 0 то итерация пропускается так как задача оператора continue перейти сразу на следующую итерацию:
for (i in 0..10) {
if (i % 2 == 0) continue
println(i)
}
Операторы break и continue относятся к ближайшему циклу и в случае использования двух или более вложенных циклов, если есть необходимость прервать внешний цикл, необходимо использовать метки. Метка пишется до цикла и заканчивается символом @:
myloop@ for (i in 0..10) {
for (j in 0..10) {
// Метка для прерывания внешнего цикла разделяется от оператора символом @
if (i == 5) break@myloop
}
}
Реклама