迭代器
为了遍历集合元素,Kotlin 标准库支持常用的_迭代器_机制——它们提供对元素进行顺序访问而无需暴露集合的底层结构。当你需要逐一处理集合中的所有元素时,例如打印值或对其进行类似的更新,迭代器非常有用。
通过调用 iterator()
函数,可以为 Iterable<T>
接口的实现者(包括 Set
和 List
)获取迭代器。
一旦你获得一个迭代器,它会指向集合的第一个元素;调用 next()
函数会返回此元素,并将迭代器位置移动到下一个(如果存在)元素。
一旦迭代器通过最后一个元素,它就不能再用于检索元素了;也不能将其重置到任何之前的位置。要再次迭代集合,请创建一个新的迭代器。
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
循环时,你会隐式地获取迭代器。因此,以下代码与上面的示例等效:
fun main() {
val numbers = listOf("one", "two", "three", "four")
for (item in numbers) {
println(item)
// one
// two
// three
// four
}
}
最后,还有一个有用的 forEach()
函数,它允许你自动迭代集合并为每个元素执行给定代码。因此,相同的示例将如下所示:
fun main() {
val numbers = listOf("one", "two", "three", "four")
numbers.forEach {
println(it)
// one
// two
// three
// four
}
}
List 迭代器
对于 list,有一个特殊的迭代器实现:ListIterator
。它支持双向迭代列表:向前和向后。
向后迭代通过函数 hasPrevious()
和 previous()
实现。此外,ListIterator
通过函数 nextIndex()
和 previousIndex()
提供有关元素索引的信息。
fun main() {
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
}
}
具有双向迭代的能力,意味着 ListIterator
在到达最后一个元素后仍可使用。
可变迭代器
对于迭代可变集合,存在 MutableIterator
,它通过元素移除函数 remove()
扩展了 Iterator
。因此,你可以在迭代集合时从中移除元素。
fun main() {
val numbers = mutableListOf("one", "two", "three", "four")
val mutableIterator = numbers.iterator()
mutableIterator.next()
mutableIterator.remove()
println("After removal: $numbers")
// After removal: [two, three, four]
}
除了移除元素,MutableListIterator
还可以通过使用 add()
和 set()
函数在迭代 list 时插入和替换元素。
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]
}