Шаг 113.
Основы Kotlin.
Списки и множества. Итерация

    На этом шаге мы познакомимся с итерацией.

    Трактирщик хочет приветствовать каждого посетителя, потому что это положительно скажется на репутации заведения. Списки поддерживают множество разных функций, позволяющих выполнить некоторое действие для каждого элемента списка. Эта идея называется итерацией.

    Один из способов выполнить итерацию со списком - использовать цикл for. Его логика такова: "Для каждого элемента в списке сделай то-то". Вы должны определить имя элемента, а компилятор Kotlin автоматически определит его тип.

    Измените код Tavern.kt и выведите сообщение с приветствием для каждого посетителя. (Также удалите код, который модифицирует и выводит patronList, чтобы избавиться от лишнего мусора в консоли.)

.   .   .   .
fun main() {
    .    .   .   .
    placeOrder("shandy,Dragon's Breath,5.91")
    for (patron in patronList) {
        println("Good evening, $patron")
    }
}
.   .   .   .
Файл с проектом можно взять здесь.


Рис.1. Обход элементов списка списком patronList с помощью for (Tavern.kt)

    Запустите Tavern.kt, и трактирщик поприветствует каждого посетителя по имени:

  Good evening, Eli 
  Good evening, Mordoc 
  Good evening, Sophie


Рис.2. Результат работы приложения

    В этом случае, из-за того что patronList принадлежит типу MutableList<String>, patron получит тип String. В теле цикла for любой код, воздействующий на patron, будет применен ко всем элементам в patronList.

    В некоторых языках, включая Java, цикл for по умолчанию работает с индексами массива или коллекции. Часто это неудобно, но такой подход имеет также свои преимущества. Синтаксис многословен и сложно читаем, но позволяет точнее управлять процессом итерации.

    В языке Kotlin все циклы for опираются на итерации. В языках Java и С# им эквивалентны циклы foreach.

    Тех, кто знаком с Java, может удивить, что обычное для Java выражение (int i = 0; i < 10; i++) { ... } невозможно в Kotlin. Вместо этого цикл for записывается так: for (i in 1..10){ ... }. Однако на уровне байт-кода компилятор оптимизирует цикл for языка Kotlin до Java-версии, если возможно, чтобы улучшить производительность.

    Обратите внимание на ключевое слово in:

    for (patron in patronList) { ... }
in определяет объект для обхода в цикле for.

    Цикл for прост и легкочитаем, но если вы предпочитаете более функциональный стиль, используйте функцию forEach().

    Функция forEach() обходит каждый элемент в списке - последовательно от начала до конца - и передает каждый элемент анонимной функции в аргументе.

    Замените цикл for функцией forEach().

.   .   .   .
fun main() {
    .    .   .   .
    placeOrder("shandy,Dragon's Breath,5.91")
    patronList.forEach { patron ->
        println("Good evening, $patron")
    }
}
.   .   .   .
Файл с проектом можно взять здесь.


Рис.3. Обход элементов списка списком patronList с помощью функции forEach (Tavern.kt)

    Запустите Tavern.kt, и вы увидите тот же вывод, что и раньше. Цикл for и функция forEach функционально эквивалентны.

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг