Цикли — це алгоритмічні структури, призначені для багаторазового виконання набору інструкцій (тіла циклу).
Цикл while Звичний цикл з передумовою while працює в Kotlin як і в інших мовах: var x=1 while (x<20){ x=x+1 } Тобто спочатку перевіряється умова. Якщо умова вірна, то виконується тіло циклу. Цикл do-while У циклі do-while тіло циклу виконується хоча б раз. Після першого виконання, перевіряється умова, якщо вона вірна, то цикл виконується повторно. var y=10 do { y-- print("y=$y") } while (y>10) В даному випадку цикл виконається лише один раз і буде виведено число 9.
Цикл for Цикл for дозволяє здійснити перебір чисел в певному діапазоні і має вигляд: for (x in 1..15){ //код програми }
Якщо потрібно, щоб останній елемент не включався використовують замість .. ключове слово until: for (x in 1 until 100) println(x) // виведе числа від 1 до 99 Зверніть увагу, що якщо цикл складається з одного рядка, то фігурні дужки можна опустити.
Для перебору в зворотньому порядку використовується ключове слово downTo. for (x in 15 downTo 1) println(x) Якщо потрібно перебирати не з одиничним кроком, то можна використати ключове слово step для задання кроку перебору. for (x in 1..100 step 2) println(x) Існує можливість перебрати всі елементи масиву наступним чином: var myArray: Array<Byte> = arrayOf(1, 2, 3) for (item in myArray){ println("myArray has $item") } Можна перебрати масив використовуючи його індекси: var myArray: Array<Byte> = arrayOf(1, 2, 3) for (index in myArray.indices){ println("$index =${myArray[index]}")
Більш того, можна одночасно пройтися і по індексам і по значенням масиву: var myArray: Array<Byte> = arrayOf(1, 2, 3, 5) for ((index, item) in myArray.withIndex()){ println("[$index] =$item")
Return, continue, break В циклах можна використовувати ключові слова return, continue, break. Так, якщо ми маємо два цикли, вкладені один в оден, то return завершить виконання обох циклів і виконання функції, в якій є ці цикли: fun main() { for (i in 0 until 10) { for (j in 0 until 10) { if (j == 2) { return
println("i=$i, j=$j")
println ("кінець програми") // не буде виведено
Continue завершує поточну ітерацію циклу і переходить до наступної: for (i in 0 until 10){ for (j in 0 until 10){ if (j==2){ continue
println("i=$i, j=$j")
Як бачимо j=2 не друкується.
break - завершує поточний цикл і продовжується виконання зовнішнього циклу: for (i in 0 until 10){ for (j in 0 until 10){ if (j==2){ break
println("i=$i, j=$j")
Як бачимо після j=1, цикл з j не продовжується.
Дещо надати наглядності і змінити поведінку break та continue (не return) можна з допомогою міток: outer@for (i in 0 until 10){ inner@for (j in 0 until 10){ if (j==2){ break@inner // стандартне виконання break
println("i=$i, j=$j")
Результат буде такий же, як і без міток. Проте, якщо ми змінемо break@inner на break@outer то break завершить обидва цикли: outer@for (i in 0 until 10){ inner@for (j in 0 until 10){ if (j==2){ break@outer
println("i=$i, j=$j")
Функція repeat() Функція repeat() не належить офіційно до циклів, але по суті виконує їхню роль. repeat() дозволяє виконати один і той самий набір інструкцій вказану кількість раз: fun main() { repeat(10){ println("Привіт")
В даному випадку слово Привіт буде виведено на консоль 10 раз.
Ми можемо одержати номер ітерації починаючи з нуля так: fun main() { repeat(10){ println("$it Привіт")
Можна також так: repeat(4) { index -> println("Iteration number: $index")
Функція forEach() Ще одна функція, яка може замінити цикл - це функція forEach(). За допомогою неї можна перебрати значення масивів або ж колекцій: val fruits = arrayOf("Apple", "Banana", "Cherry")
// використання forEach з неявним параметром 'it' fruits.forEach { println("Fruit: $it")
// використання forEach з явним іменем параметру fruits.forEach {name -> println("Fruit2: $name")
//повторити інструкцію 5 разів можна так (0..4).forEach { println(it)