2012-06-20 30 views

回答

58

使用稍顯不足簡潔的lambda語法:

mystuff = mystuff.filter(x => (x.isX && x.name == "xyz")) 

你可以找到斯卡拉匿名函數的語法here更多細節。

+1

這是否消除了性能開銷?我的意思是最後查詢是否正確表示? – zinking

4

雖然有可能是根據什麼「的MyStuff」是一些性能的影響,你總是可以過濾兩次

mystuff = mystuff.filter(_.isX).filter(_.name == "xyz") 
+0

這會導致整個列表雙循環。 – squixy

+5

@squixy只是一個供參考,並不是。 'filter'爲集合創建一個新的投影(或視圖),這樣當在迭代過程中要求元素時(即'map','fold'等等),'filter'函數被應用於看看元素是否被返回 – ThaDon

4

如果您需要經常與幾個謂詞篩選,你可以定義結合他們的一種方式:

case class And[A](p1: A=>Boolean, p2: A=>Boolean) extends (A=>Boolean) { 
    def apply(a: A) = p1(a) && p2(a) 
} 

這裏是如何用它來只保留奇數比10大:

scala> (0 until 20) filter And(_ > 10, _ % 2 == 1) 
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(11, 13, 15, 17, 19) 

以相同的方式寫入OrNot組合器很容易。