迭代器 (Iterator)

★★★★Studied

FromDesign Patterns (GoF)大話設計模式

📚 From the Books

迭代器 (Iterator)ConceptBehavioral

提供一致的方式依序走訪一個聚合物件裡的元素,而不暴露它的內部結構。核心是把「怎麼走」從「裝什麼」中抽出來,讓陣列、樹、雜湊表都能用同一套 hasNext / next 介面遍歷。

🧠 When to Use

TIP

訊號:你想讓外部「一個一個拿」集合裡的元素,但又不想(也不該)讓對方知道你底層是陣列、鏈結串列還是樹。

⚖️ Structure & Variants

經典版 — 實作語言內建 Iterator 介面
class Ring<T>(private val items: List<T>) : Iterable<T> {
    override fun iterator() = object : Iterator<T> {   // ← 外部 iterator
        private var i = 0
        override fun hasNext() = i < items.size
        override fun next() = items[i++]
    }
}

for (x in Ring(listOf("a", "b", "c"))) print(x)   // abc
  • 實作 Iterable 就能直接用 for-in;呼叫端完全不知道底層是 List
外部 vs 內部 iterator
  • 外部(external):呼叫端主動 hasNext()next() 控制節奏,能隨時暫停、跳出。
  • 內部(internal):把元素一個個丟進你給的函數(如 forEach { }),遍歷節奏由集合掌控,寫起來簡潔但較難中途控制。
與語言內建 Sequence / lazy 的關係
  • Kotlin 的 Sequence 是惰性版迭代:mapfilter 串起來只在 next() 被拉時才逐元素計算,適合大量或無窮資料流。
  • 多數情況直接用內建 Iterable/Sequence 即可,很少需要手刻 GoF 那套類別。

⚠️ Misuse & Anti-patterns

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading