2015-04-28 85 views
2

過濾無效值我有這樣的代碼:成語斯卡拉辦法從列表

val mylist = (1,2,3) 
val filteredList: List[Int] = mylist.map { num => 
    if (num < 3) num 
} 

所以我想filteredList包含(1,2)。但是,在此之後,filteredList的類型是List [Any],而不是List [Int]。我如何刪除void/null/??值使它成爲一個真正的整數列表?我嘗試添加那麼否則返回null條款從filteredList過濾出空值,但它似乎並不像斯卡拉好作風......

+0

'mylist.filter拿回List[Int](_ <3)' – ipoteka

+0

最短的形式是'mylist.filter(3>)' – Chirlo

回答

5

假設myList實際上是List(1, 2, 3),而不是元組(1, 2, 3)

您應該使用filter而不是map。您不希望在map(或甚至通常爲/)中輸入一個if語句。在這種情況下,編譯器會返回Unit,因爲elsefilled in with Unit

也就是說,編譯器開啓你的代碼:

val filteredList: List[Int] = mylist.map { num => 
    if (num < 3) num else() 
} 

這意味着你確實有

List(1, 2, Unit) // List[Any] 

而是使用:

myList.filter(_ < 3) 

或長形式:

myList.filter(num => num < 3) 

(與評論相關)您還可以使用collect來使用模式匹配在一個步驟中過濾和映射。

myList.collect { case num if(num < 3) => 
    num // or do something with num to return a different type 
} 
+0

啊,是的,對不起,我正在概括我的問題,並且按照我的意圖製作了一個元組而不是一個列表。如果在我的例子中if(num <3)那麼我會創建一個大對象,這仍然是一個好習慣嗎?我寧願不創建對象,然後將它們全部製作並過濾。 – user1436111

+0

我不太清楚你的意思。 –

+0

對不起。在我的實際用例中(這是一個巨大的泛化),我想用num作爲參數初始化一個類的實例,但只有它小於3時才如此。因此,mylist&filteredList應該是List [MyObject]類型。所以,如果我將篩選語句移到最後,我將創建所有實例,然後只使用一個小子集。我寧願不創建所有的實例。 – user1436111

4

好了,你想用filter而不是map

val filteredList = mylist.filter(num => num < 3) 

或縮寫:

val filteredList = myList.filter(_ < 3) 
2

mylistTuple3和你提不List。如果myList聲明如下val mylist = List(1,2,3),那麼你可以很容易地將其過濾,用filter

val mylist = List(1,2,3) 

mylist.filter(num => num < 3) 
res0: List[Int] = List(1,2) 
+0

啊,是的,對不起,我正在概括我的問題,並且按照我的意圖創建了一個元組而不是列表。如果在我的例子中if(num <3)那麼我會創建一個大對象,這仍然是一個好習慣嗎?我寧願不創建對象,然後將它們全部製作並過濾。 – user1436111