Видео версия урока:
https://youtu.be/vBSbvKIgiHQ
Что такое циклы?
Циклы позволяют многократно исполнять один и тот же код при определенных условиях. Во-первых, мы избегаем дублирования кода, что в принципе считается хорошим тоном. Во-вторых, количество итераций может быть бесконечно многим и повторять работу какого-либо компонента они должны, например, на протяжении всего жизненного цикла программы. В таких случаях не обойтись без конструкций для регулярного повторения исполнения кода. Я расскажу про несколько видов циклов: while и do-while.
Представим, что в нашем приложении перед открытием определенного экрана необходимо показать баннер с рекламой. А под баннером будет отображаться надпись – “Реклама закончится через 5, 4, 3… и так далее”. Экраном со счетчиком сегодня будет выступать наша консоль.
Продемонстрирую проблему: чтобы реализовать счетчик без циклов, необходимо 5 раз подряд вызвать сообщение, при этом каждый раз меняя строку с оставшимся временем.
Цикл while в Котлин
Создание переменной counter
Громоздко и много повторений. Реализуем это более изящно с помощью цикла while и одной дополнительной переменной в качестве счетчика. Создаем изменяемую переменную с именем counter и проинициализируем ее числом, с которого хотим начать обратный отсчет – 5. Далее пишем ключевое слово while, а в круглых скобках условие counter > 0. “Пока counter больше 0”. Далее пишем фигурные скобки – это тело цикла. Тот самый код, который будет исполняться, пока условие в круглых скобках является true. Мы будем изменять значение переменной, отнимая по единице каждую секунду и когда counter станет равным 0, условие вернет false и программа не зайдет внутрь цикла и не выполнит написанный код.
В теле цикла мы будем выводить наше информационное сообщение с помощью вызова println(), а в качестве значения счетчика подставим переменную $counter, используя интерполяцию строк.
Операция декремента
Если сейчас запустить цикл, он будет бесконечно выполнять инструкцию, потому что counter никогда не станет 0. То же самое будет, если написать while(true). Чтобы работа цикла закончилась через 5 итераций, нужно отнимать от счетчика единицу в каждой его итерации. Поэтому применим к переменной постфиксную операцию декремента. Мы разбирали их в теме по арифметическим операциям. Обратите внимание, что сейчас два минуса окрашены в серый цвет строки. Все потому, что теперь это стало выражением, а при применении шаблонных строк выражения необходимо дополнительно оборачивать в фигурные скобки, сохраняя знак доллара перед ними. Таким образом мы обозначили границы.
Что теперь будет происходить в программе: объявленная переменная содержит число 5. На 5 строчке проверяется условие в круглых скобках – 5 больше 0 – это истина. Программа заходит в тело цикла и вызывает вывод в консоль сообщения. В counter по-прежнему остается 5 без изменений. Затем срабатывает операция декремента и от 5 отнимается единица. Далее программа упирается в конец тела цикла и заново возвращается проверять условие. В переменной counter уже 4 и это также true. Так повторяется, пока counter не станет 0 и при очередной проверке условия, оно вернет false. После чего программа не зайдет в тело цикла и не обнаружив дополнительных инструкций завершит свое выполнение.
Кстати, здесь наглядно можно увидеть разницу между префиксным и постфиксным декрементом. Если изменим на префикс, таким образом сначала будет отниматься единица, а только потом печататься значение переменной. То есть мы в первый раз заходим в цикл и производим операцию декремента, потом будет напечатана строка. Посмотрим:
Наш счетчик распечатал и 0 тоже, потому что на момент проверки условия там все еще была единица. Но это все еще не похоже на посекундный счетчик. Для правдоподобности добавим еще одну инструкцию в цикл, а именно после каждого сообщения будем ставить на паузу программу на 1 секунду.
В общих словах. Запустив метод main(), мы запустили определенный процесс. В любом процессе присутствует поток для его выполнения. За поток отвечает класс Thread и внутри этого класса есть метод sleep(), который мы и вызвали. Он позволяет приостановить поток, в котором выполняется программа на определенное время. Время устанавливается в миллисекундах в качестве параметра – то есть записывается в круглые скобки. 1000 миллисекунд – это 1 секунда. Запустим программу и убедимся, что паузы работают и сообщение ежесекундно обновляется.
Цикл do-while
Великолепно. Посмотрим на еще один вид цикла do-while.
Конструкция выглядит вот так. Скопируем данные из первого цикла и запустим. Поведение полностью идентичное, за исключением одного. Тело цикла do-while сначала выполнит один раз код внутри себя при любых обстоятельствах, а только потом будет проверять условие на true или false и определять надо ли входить в цикл еще раз. Даже если мы намеренно выставим false в проверке условия, цикл все равно сначала отработает одну итерацию.
Дополнительные материалы
🔹 Тесты и практика по этому уроку: https://t.me/KotlinBasicsBot
🔹 Код из всех уроков в личном канале: https://t.me/ievetrov_dev
🔹 Бесплатный курс по Android: https://clck.ru/376Zab
🔹 Вопросы к собеседованию Android: https://t.me/AndroidSprint_Interview
🔹 VK: https://vk.com/ievetrov.development