...... 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 } } }