反覆運算器
為了遍歷集合元素,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 iterators)
對於列表,有一種特殊的反覆運算器實作: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 在到達最後一個元素後仍然可以使用。
可變反覆運算器 (Mutable iterators)
為了遍歷可變集合,提供了 MutableIterator,它擴充了 Iterator 並增加了元素移除函式 remove()。因此,您可以在遍歷集合的同時移除其中的元素。
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() 函式插入與替換元素。
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]
}