Что такое циклы?
Циклы позволяют многократно исполнять один и тот же код при определенных условиях. Во-первых, мы избегаем дублирования кода, что в принципе считается хорошим тоном. Во-вторых, количество итераций может быть бесконечно многим и повторять работу какого-либо компонента они должны, например, на протяжении всего жизненного цикла программы. В таких случаях не обойтись без конструкций для регулярного повторения исполнения кода. Я расскажу про несколько видов циклов: while и do-while.
Представим, что в нашем приложении перед открытием определенного экрана необходимо показать баннер с рекламой. А под баннером будет отображаться надпись – “Реклама закончится через 5, 4, 3… и так далее”. Экраном со счетчиком сегодня будет выступать наша консоль.
Продемонстрирую проблему: чтобы реализовать счетчик без циклов, необходимо 5 раз подряд вызвать сообщение, при этом каждый раз меняя строку с оставшимся временем.
println("Реклама закончится через 5")
println("Реклама закончится через 4")
println("Реклама закончится через 3")
println("Реклама закончится через 2")
println("Реклама закончится через 1")
Цикл while в Котлин
Создание переменной counter
Громоздко и много повторений. Реализуем это более изящно с помощью цикла while и одной дополнительной переменной в качестве счетчика. Создаем изменяемую переменную с именем counter и проинициализируем ее числом, с которого хотим начать обратный отсчет – 5. Далее пишем ключевое слово while, а в круглых скобках условие counter > 0. “Пока counter больше 0”. Далее пишем фигурные скобки – это тело цикла. Тот самый код, который будет исполняться, пока условие в круглых скобках является true. Мы будем изменять значение переменной, отнимая по единице каждую секунду и когда counter станет равным 0, условие вернет false и программа не зайдет внутрь цикла и не выполнит написанный код.
В теле цикла мы будем выводить наше информационное сообщение с помощью вызова println(), а в качестве значения счетчика подставим переменную $counter, используя интерполяцию строк.
var counter = 5
while (counter > 0) {
println("Реклама закончится через $counter")
}
Операция декремента
Если сейчас запустить цикл, он будет бесконечно выполнять инструкцию, потому что counter никогда не станет 0. То же самое будет, если написать while(true). Чтобы работа цикла закончилась через 5 итераций, нужно отнимать от счетчика единицу в каждой его итерации. Поэтому применим к переменной постфиксную операцию декремента. Мы разбирали их в теме по арифметическим операциям. Обратите внимание, что сейчас два минуса окрашены в серый цвет строки. Все потому, что теперь это стало выражением, а при применении шаблонных строк выражения необходимо дополнительно оборачивать в фигурные скобки, сохраняя знак доллара перед ними. Таким образом мы обозначили границы.
var counter = 5
while (counter > 0) {
println("Реклама закончится через ${counter--}")
}
Что теперь будет происходить в программе: объявленная переменная содержит число 5. На 5 строчке проверяется условие в круглых скобках – 5 больше 0 – это истина. Программа заходит в тело цикла и вызывает вывод в консоль сообщения. В counter по-прежнему остается 5 без изменений. Затем срабатывает операция декремента и от 5 отнимается единица. Далее программа упирается в конец тела цикла и заново возвращается проверять условие. В переменной counter уже 4 и это также true. Так повторяется, пока counter не станет 0 и при очередной проверке условия, оно вернет false. После чего программа не зайдет в тело цикла и не обнаружив дополнительных инструкций завершит свое выполнение.
Кстати, здесь наглядно можно увидеть разницу между префиксным и постфиксным декрементом. Если изменим на префикс, таким образом сначала будет отниматься единица, а только потом печататься значение переменной. То есть мы в первый раз заходим в цикл и производим операцию декремента, потом будет напечатана строка. Посмотрим:
while (counter > 0) {
println("Реклама закончится через ${--counter}")
}
Наш счетчик распечатал и 0 тоже, потому что на момент проверки условия там все еще была единица. Но это все еще не похоже на посекундный счетчик. Для правдоподобности добавим еще одну инструкцию в цикл, а именно после каждого сообщения будем ставить на паузу программу на 1 секунду.
while (counter > 0) {
println("Реклама закончится через ${counter--}")
Thread.sleep(1000)
}
В общих словах. Запустив метод main(), мы запустили определенный процесс. В любом процессе присутствует поток для его выполнения. За поток отвечает класс Thread и внутри этого класса есть метод sleep(), который мы и вызвали. Он позволяет приостановить поток, в котором выполняется программа на определенное время. Время устанавливается в миллисекундах в качестве параметра – то есть записывается в круглые скобки. 1000 миллисекунд – это 1 секунда. Запустим программу и убедимся, что паузы работают и сообщение ежесекундно обновляется.
Цикл do-while
Великолепно. Посмотрим на еще один вид цикла do-while.
do {
println("${counter--}")
Thread.sleep(1000)
} while (counter > 0)
Конструкция выглядит вот так. Скопируем данные из первого цикла и запустим. Поведение полностью идентичное, за исключением одного. Тело цикла do-while сначала выполнит один раз код внутри себя при любых обстоятельствах, а только потом будет проверять условие на true или false и определять надо ли входить в цикл еще раз. Даже если мы намеренно выставим false в проверке условия, цикл все равно сначала отработает одну итерацию.
do {
println("${counter--}")
Thread.sleep(1000)
} while (false)
Для тех, кто собрался стать Android-разработчиком
Пошаговая
схема
Описание процесса обучения от основ Kotlin до Android-разработчика
Бесплатные
уроки
Авторский бесплатный курс по основам языка программирования Kotlin
Обучающий
бот
Тренажер и самоучитель по Котлин – бесплатные тесты и практика
Здравствуй. Спасибо за лаконичный и доступный для понимая курс.
Очень классный сайт, радует то, что видеоматериалы дублированы в текстовом формате, очень удобно.
Обрати внимание на следующее:
открой свой же сайт, зайди на любой урок по Котлину и внизу страницы увидишь ошибку, там где кнопки «след. запись» и «пред. запись» (они перепутаны и работают наоборот).
Выступаешь в роле ментора?
Приветствую. Спасибо за фидбек, сайт пофиксим руки дойдут)
По обучению вся актуальная информация в боте, в разделе с практикой.