迭代器
為了遍歷集合元素,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),有一種特殊的迭代器實作: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()
函式來插入和替換元素。
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]
}