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

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

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

Циклы позволяют многократно исполнять один и тот же код при определенных условиях. Во-первых, мы избегаем дублирования кода, что в принципе считается хорошим тоном. Во-вторых, количество итераций может быть бесконечно многим и повторять работу какого-либо компонента они должны, например, на протяжении всего жизненного цикла программы. В таких случаях не обойтись без конструкций для регулярного повторения исполнения кода. Я расскажу про несколько видов циклов: 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)

Проверьте себя после изучения темы

Бесплатный бот с тестами и практическими заданиями по Kotlin.

  • 22 бесплатных урока
  • Тесты к каждому уроку (всего 220 вопросов)
  • Задачи в рамках практики KotlinSprint (120 задач) и курсовой проект «Телеграм бот для изучения иностранных слов»
Начать обучение

Вам также может быть интересно

Узнать подробнее
Курс AndroidSprint

Глубокое обучение Android разработке с 0 до получения оффера. Только персональная практика с гарантией получения продуктового опыта.

Узнать подробнее
Узнать подробнее
Практикум по Kotlin

Изучение Котлин с 0 для профессиональной разработки. Личный ментор и разбор кода задач через git-flow.

Узнать подробнее
Узнать подробнее
Бесплатные уроки по Kotlin разработке

Самостоятельное освоение базы по языку для дальнейшего развития в Android/back-end разработке или в автотестах.

Узнать подробнее
Узнать подробнее
Onboarding в разработку

Полное обучение Android разработке с нуля до получения оффера. Делаем упор на практику и обратную связь

Узнать подробнее
Узнать подробнее
Обучающий Kotlin телеграм бот (с тестами)

Ваш основной инструмент для изучения основ языка. Бесплатные тесты и практика внутри.

Узнать подробнее
Узнать подробнее
Бесплатные уроки по Android разработке

Самостоятельное обучение разработке Андроид приложений. Понятные видеоуроки с разжеванными примерами.

Узнать подробнее
Узнать подробнее
Курс по UI/Unit тестированию

Для ручных тестировщиков, которые готовы осваивать автотесты с использованием актуального стека технологий. [в разработке]

Узнать подробнее
Узнать подробнее
Обучающий Android телеграм бот (с тестами)

Бесплатные теоретические тесты для самопроверки. А также информер на практических спринтах по Android.

Узнать подробнее