...... java
只要同時知足這兩個性質, 就能夠放心地把iterator的正確性 設計成 依賴於 hasNext, next, hasNext, next....這個「合理的」調用序列 。 curl
能夠發現, 對於基於容器(List,Map,Set等等)的iterator來講, 這兩個性質是「自然地, 直接地, 簡單地」就知足的。其緣由在於:若是hasNext方法是無反作用的,那麼上面的兩個性質必定會知足。 this
可是當咱們要寫一些並非基於容器的迭代器的時候, 這時候hasNext方法有可能會有反作用, 咱們就要注意檢查是否知足上面兩個條件了。 url
總結起來: scala
看成爲iterator的編寫者的時候: 咱們要儘可能讓hasNext沒有反作用,若是實在不行,就要注意驗證是否是可以知足上面的兩個性質. 設計
看成爲iterator的使用者的時候: 咱們要假定hasNext是有反作用的, 因此要嚴格按照hasNext, next ... 這個調用序列來使用別人寫的iterator code
最後,給出一個例子, 寫一個能夠迭代行的迭代器: 對象
import java.io._ def toReader(fp: String, enc: String): Reader = new InputStreamReader(new FileInputStream(new File(fp)), enc) def iLines(reader: Reader): Iterator[String] = { val br = new BufferedReader(reader) var curline = "" var checked = false var checkedRes = false new Iterator[String] { def hasNext: Boolean = { if (checked) return checkedRes checked = true curline = br.readLine() checkedRes = if (curline != null) true else false return checkedRes } def next: String = { if (!checked) this.hasNext checked = false return curline } } }