Циклы (Loops) - это чуть-ли не самая используемая функциональность в любом языке программирования, поэтому крайне важно понимать, как работать с циклами в конкретном языке. Kotlin предоставляет очень богатый функционал для эффективной работы с таким циклами, как for и while, который значительно богаче чем в Java.
Для того, что-бы лучше понять циклы, рекомендую сперва прочитать статью про массивы.
Начнем с простого примера, пройдемся по числам от 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.
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 (x > 0) {
// выполняется до тек пор пока выражение x > 0 выдает true
println("Hello")
}
do {
// сначала выполниться один раз, а затем пока выражение = true
println("Hello")
} while (x > 0)
Обновлено 29 марта 2021
Теги: