Skip to content

迭代器

为了遍历集合元素,Kotlin 标准库支持常用的迭代器机制—— 它们是对象,提供对元素按顺序访问的能力,而无需暴露集合的底层结构。 当你需要逐个处理集合的所有元素时,例如打印值或 对它们进行类似更新时,迭代器非常有用。

可以通过调用 iterator() 函数,为 Iterable<T> 接口的实现者(包括 SetList)获取迭代器。

一旦获取到迭代器,它就指向集合的第一个元素;调用 next() 函数会返回该元素,如果存在下一个元素,则将迭代器位置移动到下一个元素。

一旦迭代器通过了最后一个元素,它就不能再用于检索元素;也不能将其 重置到任何之前的位置。要再次遍历集合,请创建一个新的迭代器。

kotlin

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 循环时,你 会隐式地获取迭代器。因此,以下代码与上面的示例等效:

kotlin

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

最后,还有一个实用的 forEach() 函数,它允许你自动迭代集合并为每个元素执行 给定的代码。因此,同样的示例会是这样:

kotlin

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

列表迭代器

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

向后迭代由函数 hasPrevious()previous() 实现。 此外,ListIterator 通过函数 nextIndex()previousIndex() 提供有关元素索引的信息。

kotlin

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, 它通过元素移除函数 remove() 扩展了 Iterator。 因此,你可以在迭代集合时移除其中的元素。

kotlin

fun main() {
    val numbers = mutableListOf("one", "two", "three", "four") 
    val mutableIterator = numbers.iterator()
    
    mutableIterator.next()
    mutableIterator.remove()    
    println("移除后: $numbers")
    // After removal: [two, three, four]
}

除了移除元素,MutableListIterator 还可以通过使用 add()set() 函数,在迭代列表时插入和替换元素。

kotlin

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]
}