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

while do while. Обратный отсчет с Thread.sleep 1 - Android [Kotlin] для начинающих

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

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

Обучающийбот
Обучающий
бот

Тренажер и самоучитель по Котлин – бесплатные тесты и практика

Поделиться уроком

2 комментария

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  1. Здравствуй. Спасибо за лаконичный и доступный для понимая курс.

    Очень классный сайт, радует то, что видеоматериалы дублированы в текстовом формате, очень удобно.

    Обрати внимание на следующее:
    открой свой же сайт, зайди на любой урок по Котлину и внизу страницы увидишь ошибку, там где кнопки «след. запись» и «пред. запись» (они перепутаны и работают наоборот).

    Выступаешь в роле ментора?