2015-04-28 92 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