迭代器

对于遍历集合元素, Kotlin 标准库支持 迭代器 的常用机制—— 对象可按顺序提供对元素的访问权限,而不会暴露集合的底层结构。 当需要逐个处理集合的所有元素(例如打印值或对其进行类似更新)时, 迭代器非常有用。

Iterable 接口的继承者 (包括 Set 与 List)可以通过调用 iterator() 函数获得迭代器。

一旦获得迭代器它就指向集合的第一个元素;调用 next() 函数将返回此元素,并将迭代器指向下一个元素(如果下一个元素存在)。

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

2. fun main() {
3. //sampleStart
4. val numbers = listOf("one", "two", "three", "four")
5. val numbersIterator = numbers.iterator()
6. while (numbersIterator.hasNext()) {
7. println(numbersIterator.next())
8. }
9. //sampleEnd
10. }

遍历 Iterable 集合的另一种方法是众所周知的 for 循环。在集合中使用 for 循环时, 会隐式获取迭代器。因此,以下代码与上述示例等效:

2. fun main() {
3. //sampleStart
4. val numbers = listOf("one", "two", "three", "four")
5. for (item in numbers) {
6. println(item)
7. }
8. //sampleEnd
9. }

最后,有一个好用的 forEach() 函数,可自动迭代集合并为每个元素执行给定的代码。因此,等效的示例如下所示:

2. fun main() {
3. //sampleStart
4. val numbers = listOf("one", "two", "three", "four")
5. numbers.forEach {
6. println(it)
7. }
8. //sampleEnd
9. }

List 迭代器

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

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

2. fun main() {
3. //sampleStart
4. val numbers = listOf("one", "two", "three", "four")
5. val listIterator = numbers.listIterator()
6. while (listIterator.hasNext()) listIterator.next()
7. println("Iterating backwards:")
8. while (listIterator.hasPrevious()) {
9. print("Index: ${listIterator.previousIndex()}")
10. println(", value: ${listIterator.previous()}")
11. }
12. //sampleEnd
13. }

具有双向迭代的能力意味着 ListIterator 在到达最后一个元素后仍可以使用。

可变迭代器

为了迭代可变集合,于是有了 MutableIterator 来扩展 Iterator 使其具有元素删除函数 remove() 。 因此,可以在迭代时从集合中删除元素。

2. fun main() {
3. //sampleStart
4. val numbers = mutableListOf("one", "two", "three", "four")
5. val mutableIterator = numbers.iterator()

7. mutableIterator.next()
8. mutableIterator.remove()
9. println("After removal: $numbers")
10. //sampleEnd
11. }

除了删除元素, MutableListIterator 还可以在迭代列表时插入和替换元素。

2. fun main() {
3. //sampleStart
4. val numbers = mutableListOf("one", "four", "four")
5. val mutableListIterator = numbers.listIterator()

7. mutableListIterator.next()
8. mutableListIterator.add("two")
9. mutableListIterator.next()
10. mutableListIterator.set("three")
11. println(numbers)
12. //sampleEnd
13. }