Итераторы
Для перебора элементов коллекции стандартная библиотека Kotlin поддерживает широко используемый механизм итераторов — объектов, обеспечивающих последовательный доступ к элементам без раскрытия внутренней структуры коллекции. Итераторы полезны, когда нужно обработать все элементы коллекции по одному, например вывести значения или выполнить для них аналогичные изменения.
Итераторы можно получить для наследников интерфейса Iterable<T>, включая Set и List, вызвав функцию iterator().
Получив итератор, вы переходите к первому элементу коллекции; вызов функции next() возвращает этот элемент и перемещает итератор к следующему элементу, если он существует.
После того как итератор проходит последний элемент, его больше нельзя использовать для получения элементов; его также нельзя вернуть на предыдущую позицию. Чтобы снова перебрать коллекцию, создайте новый итератор.
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four")
val numbersIterator = numbers.iterator()
while (numbersIterator.hasNext()) {
println(numbersIterator.next())
// one
// two
// three
// four
}
//sampleEnd
}
Ещё один способ перебрать коллекцию Iterable — использовать хорошо известный цикл for. При использовании for для коллекции итератор получается неявно. Таким образом, следующий код эквивалентен примеру выше:
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four")
for (item in numbers) {
println(item)
// one
// two
// three
// four
}
//sampleEnd
}
Наконец, есть полезная функция forEach(), которая позволяет автоматически перебирать коллекцию и выполнять заданный код для каждого элемента. Тогда тот же пример будет выглядеть так:
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four")
numbers.forEach {
println(it)
// one
// two
// three
// four
}
//sampleEnd
}
Итераторы списков
Для списков предусмотрена специальная реализация итератора: ListIterator. Она поддерживает перебор списков в обоих направлениях: вперёд и назад.
Обратный перебор реализован с помощью функций hasPrevious() и previous(). Кроме того, ListIterator предоставляет сведения об индексах элементов с помощью функций nextIndex() и previousIndex().
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four")
val listIterator = numbers.listIterator()
while (listIterator.hasNext()) listIterator.next()
println("Iterating backwards:")
// Iterating backwards:
while (listIterator.hasPrevious()) {
print("Index: ${listIterator.previousIndex()}")
println(", value: ${listIterator.previous()}")
// Index: 3, value: four
// Index: 2, value: three
// Index: 1, value: two
// Index: 0, value: one
}
//sampleEnd
}
Возможность перебирать элементы в обоих направлениях означает, что ListIterator можно использовать и после достижения последнего элемента.
Изменяемые итераторы
Для перебора изменяемых коллекций существует MutableIterator, расширяющий Iterator функцией удаления элемента remove(). Это позволяет удалять элементы из коллекции во время её перебора.
fun main() {
//sampleStart
val numbers = mutableListOf("one", "two", "three", "four")
val mutableIterator = numbers.iterator()
mutableIterator.next()
mutableIterator.remove()
println("After removal: $numbers")
// After removal: [two, three, four]
//sampleEnd
}
Помимо удаления элементов, MutableListIterator позволяет добавлять и заменять элементы во время перебора списка с помощью функций add() и set().
fun main() {
//sampleStart
val numbers = mutableListOf("one", "four", "four")
val mutableListIterator = numbers.listIterator()
mutableListIterator.next()
mutableListIterator.add("two")
println(numbers)
// [one, two, four, four]
mutableListIterator.next()
mutableListIterator.set("three")
println(numbers)
// [one, two, three, four]
//sampleEnd
}
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/iterators.html