用于从列表中过滤空值的惯用Scala方法

时间:2015-04-28 21:44:37

标签: scala

我的代码如下:

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

所以我希望filterList包含(1,2)。但是,在此之后,filteredList的类型是List [Any],而不是List [Int]。如何删除void / null / ??使值成为真正的整数列表?我尝试添加一个else null子句,然后从filteredList中过滤掉空值,但它看起来不像Scala样式......

3 个答案:

答案 0 :(得分:5)

假设myList实际上是List(1, 2, 3)而不是元组(1, 2, 3)

您应该使用filter而不是map。您不希望在if中放置一个map语句(或者通常是/通常)。在这种情况下,它返回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
}

答案 1 :(得分:4)

嗯,您想使用filter代替map

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

或缩写:

val filteredList = myList.filter(_ < 3)

答案 2 :(得分:2)

如您所述,

mylistTuple3而不是List。如果myList声明为此val mylist = List(1,2,3),那么您可以轻松过滤它并使用List[Int]

取回filter
val mylist = List(1,2,3)

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