def filter(p: A => Boolean): Iterator[A] = new AbstractIterator[A] {
// TODO 2.12 - Make a full-fledged FilterImpl that will reverse sense of p
private var hd: A = _ //迭代器當(dāng)前游標(biāo)所在的值
private var hdDefined: Boolean = false
def hasNext: Boolean = hdDefined || {
do {
if (!self.hasNext) return false
hd = self.next()
} while (!p(hd))
hdDefined = true
true
}
def next() = if (hasNext) { hdDefined = false; hd } else empty.next()
}
filter為scala trait Iterator 內(nèi)的一個方法燥狰,主要目的是在原迭代器基礎(chǔ)上根據(jù)p匿名函數(shù)生成一個符合條件的迭代器
符合什么條件呢吞歼?即原 Iterator 的元素迭代一遍,并作為 p 匿名函數(shù)的參數(shù)執(zhí)行一遍沧烈,凡是結(jié)果為 true 的元素則滿足條件耘眨,放入新的迭代器中
private var hd: A = _ 這個可以看作迭代器在迭代的時候當(dāng)前游標(biāo)所指向的元素值
private var hdDefined: Boolean = false 這個可以看作一個標(biāo)識符,迭代器找到了符合條件的元素税迷,該開關(guān)置為true永丝,否則置為false
后續(xù)也是根據(jù)這個值來實現(xiàn) hasNext方法
hasNext方法也是作為判斷是否還存在滿足條件元素的依據(jù)
hasNext方法內(nèi)部會先去判斷hdDefined的值,
- 如果該值為true箭养,則直接判定還有滿足條件的元素(這么看來类溢,hdDefined有點緩存的味道,如果沒有這個值露懒,多次調(diào)用hasNext方法則必然需要重復(fù)執(zhí)行迭代器的循環(huán)闯冷,使性能降低)
- 如果該值為false,則再執(zhí)行迭代器循環(huán)懈词,其中 self.hasNext 蛇耀、self.next() 都是外部迭代器的方法,當(dāng)找到一個符合條件的元素后 (!p(hd)) 坎弯,執(zhí)行p函數(shù)結(jié)果為true纺涤,取反后為false,跳出循環(huán)抠忘。同時將hdDefined置為true撩炊,表示已找到了下一個滿足條件的元素。同時hasNext方法也返回true
next方法用來獲取下一個滿足條件的元素
首先調(diào)用hasNext 查看是否有滿足條件的元素崎脉,沒有則直接拋出Nothing
有則返回該元素拧咳,同時將hdDefined置為false,表示已找到這個符合條件的元素囚灼,需要重新循環(huán)才能判斷是否存在下一個滿足條件的值
短短幾行代碼骆膝,其中卻蘊含了巨大的智慧和設(shè)計訣竅