9.1.1.3 迭代器

原文链接: https://kotlinlang.org/docs/iterators.html

9.1.1.3 迭代器

为了遍历集合元素,Kotlin 标准库支持常用的迭代器机制——迭代器是顺序访问元素、而不暴露集合底层结构的对象。当你需要逐个处理集合中的所有元素时(例如打印值或对它们做类似的更新),迭代器很有用。

对于 Iterable<T> 接口的继承者(包括 Set 和 List),可以通过调用 iterator() 函数获得迭代器。

获得迭代器后,它指向集合的第一个元素;调用 next() 函数会返回该元素,并在存在下一个元素时把迭代器位置移动到它上面。

一旦迭代器越过最后一个元素,它就不能再用于获取元素,也无法重置到之前的任何位置。要再次遍历该集合,请创建一个新的迭代器。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

fun main() {
    val numbers = listOf("one", "two", "three", "four")
    val numbersIterator = numbers.iterator()
    while (numbersIterator.hasNext()) {
        println(numbersIterator.next())
        // one
        // two
        // three
        // four
    }
}

遍历 Iterable 集合的另一种方式是众所周知的 for 循环。在集合上使用 for 时,你会隐式获得迭代器。因此,下面这段代码与上面的例子等价:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11

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

最后,还有一个很有用的 forEach() 函数,让你可以自动遍历集合并对每个元素执行给定代码。于是同一个例子会变成这样:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11

fun main() {
    val numbers = listOf("one", "two", "three", "four")
    numbers.forEach {
        println(it)
        // one
        // two
        // three
        // four
    }
}

列表迭代器

对于列表,有一种特殊的迭代器实现:ListIterator。它支持双向遍历列表:向前和向后。

向后遍历由 hasPrevious() 和 previous() 函数实现。此外,ListIterator 还通过 nextIndex() 和 previousIndex() 函数提供元素索引信息。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16

fun main() {
    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()}")
        // Index: 3, value: four
        // Index: 2, value: three
        // Index: 1, value: two
        // Index: 0, value: one
    }
}

由于具备双向遍历的能力,ListIterator 在到达最后一个元素之后仍然可以使用。

可变迭代器

要遍历可变集合,可以使用 MutableIterator,它在 Iterator 的基础上增加了删除元素的函数 remove()。因此你可以在遍历的同时从集合中删除元素。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

fun main() {
    val numbers = mutableListOf("one", "two", "three", "four")
    val mutableIterator = numbers.iterator()

    mutableIterator.next()
    mutableIterator.remove()
    println("After removal: $numbers")
    // 删除之后:[two, three, four]
}

除了删除元素之外,MutableListIterator 还可以在遍历列表时通过 add() 和 set() 函数插入和替换元素。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14

fun main() {
    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]
}