Spec-Zone.ru › Kotlin 1.8

Итераторы

Для обхода элементов коллекции стандартная библиотека 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())
    }
//sampleEnd
}

Другой способ пройти по коллекции Iterable — это известный цикл for. При использовании for по коллекции итератор получается неявно. Таким образом, следующий код эквивалентен приведенному выше примеру:

fun main() {
//sampleStart
    val numbers = listOf("one", "two", "three", "four")
    for (item in numbers) {
        println(item)
    }
//sampleEnd
}

Наконец, есть полезная функция forEach(), которая позволяет автоматически перебирать коллекцию и выполнять заданный код для каждого элемента. Таким образом, тот же пример будет выглядеть так:

fun main() {
//sampleStart
    val numbers = listOf("one", "two", "three", "four")
    numbers.forEach {
        println(it)
    }
//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:")
    while (listIterator.hasPrevious()) {
        print("Index: ${listIterator.previousIndex()}")
        println(", value: ${listIterator.previous()}")
    }
//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")
//sampleEnd
}

В дополнение к удалению элементов, MutableListIterator также может вставлять и заменять элементы во время итерации по списку.

fun main() {
//sampleStart
    val numbers = mutableListOf("one", "four", "four") 
    val mutableListIterator = numbers.listIterator()
    
    mutableListIterator.next()
    mutableListIterator.add("two")
    mutableListIterator.next()
    mutableListIterator.set("three")   
    println(numbers)
//sampleEnd
}
Последнее изменение: 10 января 2023 г.
Создание коллекций Диапазоны и прогрессии

© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/iterators.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API