1. 程式人生 > >Scala 容器基礎(十七):使用filter方法過濾集合元素

Scala 容器基礎(十七):使用filter方法過濾集合元素

來源:https://my.oschina.net/nenusoul/blog/658238

Problem

    你想要篩選出集合中的一些元素形成一個新的集合,這些元素都是滿足你的篩選條件的。

Solution

    在10.3節中,“選擇一個集合方法來解決問題”,大量的方法可以被用來過濾輸入集合的元素然後生成新的集合。這一節中展示了filter方法。那麼如何正確使用集合的filter方法呢,首先你需要給filter方法一個判斷條件或者返回true/false的函式,這個判斷條件(函式)的輸入型別要與集合元素型別一致,返回值是布林型的。filter方法會對集合的每一個元素呼叫判斷條件,當條件為true的時候則元素進入新的集合否則會被過濾掉。你還需要使用一個變數來指向新的集合。

    下面這個例子展示了,如何通過取模演算法從一個輸入集合中篩選出偶數並形成一個新的集合:


 正如上面展示的,filter方法返回了所有使假設條件(_ % 2 == 0)為真的集合元素組成的新集合。還有一個方法filterNot,可以返回所有使假設條件返回false的元素組成的新集合。


  filter方法對比其他方法的特點有:

  • filter方法遍歷整個集合,其他的方法都只是遍歷一部分元素

  • filter方法允許你提供一個判斷條件(函式),來過濾集合元素

    如何篩選集合元素完全取決於你的演算法,接下來的例子展示了一些方法來過濾字串列表:


 當你的判斷邏輯複雜,沒有辦法一行寫完,我們可以在filter內部使用多行的判斷邏輯:



你同樣可以定義一個判斷函式,然後把這個函式傳給filter方法:


接下來的這個例子告訴你,你可以多次連續呼叫filter方法:


我們在一個檔案中讀取所有的行,轉換為一個List,每行是一個元素,然後我們把空行過濾掉,然後再把#開頭的過濾掉。看起來是一個統計shell指令碼程式碼行數的演算法。

    使用filter的兩個關鍵點是:

  • 你的演算法需要能正確判斷出你所需要的元素,並返回true,對於你不需要的資料則返回false

  • 記得用一個新的變數指向filter方法返回的集合,因為filter方法並不會對原集合做改變