Найти тему

Урок 6: Циклы в Kotlin. while, do-while

Оглавление
Видео версия урока:
https://youtu.be/vBSbvKIgiHQ

Что такое циклы?

Циклы позволяют многократно исполнять один и тот же код при определенных условиях. Во-первых, мы избегаем дублирования кода, что в принципе считается хорошим тоном. Во-вторых, количество итераций может быть бесконечно многим и повторять работу какого-либо компонента они должны, например, на протяжении всего жизненного цикла программы. В таких случаях не обойтись без конструкций для регулярного повторения исполнения кода. Я расскажу про несколько видов циклов: while и do-while.

Представим, что в нашем приложении перед открытием определенного экрана необходимо показать баннер с рекламой. А под баннером будет отображаться надпись – “Реклама закончится через 5, 4, 3… и так далее”. Экраном со счетчиком сегодня будет выступать наша консоль.

Продемонстрирую проблему: чтобы реализовать счетчик без циклов, необходимо 5 раз подряд вызвать сообщение, при этом каждый раз меняя строку с оставшимся временем.

-2

Цикл while в Котлин

Создание переменной counter

Громоздко и много повторений. Реализуем это более изящно с помощью цикла while и одной дополнительной переменной в качестве счетчика. Создаем изменяемую переменную с именем counter и проинициализируем ее числом, с которого хотим начать обратный отсчет – 5. Далее пишем ключевое слово while, а в круглых скобках условие counter > 0. “Пока counter больше 0”. Далее пишем фигурные скобки – это тело цикла. Тот самый код, который будет исполняться, пока условие в круглых скобках является true. Мы будем изменять значение переменной, отнимая по единице каждую секунду и когда counter станет равным 0, условие вернет false и программа не зайдет внутрь цикла и не выполнит написанный код.

В теле цикла мы будем выводить наше информационное сообщение с помощью вызова println(), а в качестве значения счетчика подставим переменную $counter, используя интерполяцию строк.

-3

Операция декремента

Если сейчас запустить цикл, он будет бесконечно выполнять инструкцию, потому что counter никогда не станет 0. То же самое будет, если написать while(true). Чтобы работа цикла закончилась через 5 итераций, нужно отнимать от счетчика единицу в каждой его итерации. Поэтому применим к переменной постфиксную операцию декремента. Мы разбирали их в теме по арифметическим операциям. Обратите внимание, что сейчас два минуса окрашены в серый цвет строки. Все потому, что теперь это стало выражением, а при применении шаблонных строк выражения необходимо дополнительно оборачивать в фигурные скобки, сохраняя знак доллара перед ними. Таким образом мы обозначили границы.

-4

Что теперь будет происходить в программе: объявленная переменная содержит число 5. На 5 строчке проверяется условие в круглых скобках – 5 больше 0 – это истина. Программа заходит в тело цикла и вызывает вывод в консоль сообщения. В counter по-прежнему остается 5 без изменений. Затем срабатывает операция декремента и от 5 отнимается единица. Далее программа упирается в конец тела цикла и заново возвращается проверять условие. В переменной counter уже 4 и это также true. Так повторяется, пока counter не станет 0 и при очередной проверке условия, оно вернет false. После чего программа не зайдет в тело цикла и не обнаружив дополнительных инструкций завершит свое выполнение.

Кстати, здесь наглядно можно увидеть разницу между префиксным и постфиксным декрементом. Если изменим на префикс, таким образом сначала будет отниматься единица, а только потом печататься значение переменной. То есть мы в первый раз заходим в цикл и производим операцию декремента, потом будет напечатана строка. Посмотрим:

-5

Наш счетчик распечатал и 0 тоже, потому что на момент проверки условия там все еще была единица. Но это все еще не похоже на посекундный счетчик. Для правдоподобности добавим еще одну инструкцию в цикл, а именно после каждого сообщения будем ставить на паузу программу на 1 секунду.

В общих словах. Запустив метод main(), мы запустили определенный процесс. В любом процессе присутствует поток для его выполнения. За поток отвечает класс Thread и внутри этого класса есть метод sleep(), который мы и вызвали. Он позволяет приостановить поток, в котором выполняется программа на определенное время. Время устанавливается в миллисекундах в качестве параметра – то есть записывается в круглые скобки. 1000 миллисекунд – это 1 секунда. Запустим программу и убедимся, что паузы работают и сообщение ежесекундно обновляется.

Цикл do-while

Великолепно. Посмотрим на еще один вид цикла do-while.

-6

Конструкция выглядит вот так. Скопируем данные из первого цикла и запустим. Поведение полностью идентичное, за исключением одного. Тело цикла do-while сначала выполнит один раз код внутри себя при любых обстоятельствах, а только потом будет проверять условие на true или false и определять надо ли входить в цикл еще раз. Даже если мы намеренно выставим false в проверке условия, цикл все равно сначала отработает одну итерацию.

-7

Дополнительные материалы

🔹 Тесты и практика по этому уроку: 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