2014-09-03 37 views
1

我正在尋找一個慣用的方式來做到這一點:使用flatmap過濾和計算值的集合

val list = Seq(1, 2, 3, 4, 5, 6, 7) 
list.flatMap(i => if (i % 2 == 0) Some(i * 2) else None) 
list.flatMap(i => if (i % 2 == 0) (i * 2) :: Nil else Nil) 

兩種方式可以返回預期的結果,我不知道哪種方式更好。謝謝你的時間!

編輯:

我知道list.filter(_ % 2 == 0).map(_ * 2)有利於這個簡單的例子,但我真正的情況是複雜的,有用於過濾不止一個接受的條件,每個有過濾元件自身的處理功能。

+0

語法是'list.filter(_%2 == 0)' – senia 2014-09-03 07:33:49

+0

'Seq(1,2,3,4,5,6,7).filter(_%2!= 0).map( _ * 2)'? – 2014-09-03 07:34:00

回答

4

對於多個過濾條件和相關的計算,你可以嘗試這樣的事情。

val list = Seq(1, 2, 3, 4, 5, 6, 7) 

    list.collect { 
    case i if (i % 2 == 0) => i * 2 
    case i if (i % 3 == 0) => i * 3 
    case i if (i % 5 == 0) => i * 5 
    }     //> res0: Seq[Int] = List(4, 9, 8, 25, 12) 

,如果你需要做的是不匹配的元素的東西可以添加默認case。如果你這樣做,那麼你不妨使用map而不是collect,因爲case語句的函數不再是局部函數。