我的代码如下:
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样式......
答案 0 :(得分:5)
假设myList
实际上是List(1, 2, 3)
而不是元组(1, 2, 3)
您应该使用filter
而不是map
。您不希望在if
中放置一个map
语句(或者通常是/通常)。在这种情况下,它返回Unit
,因为编译器else
为filled 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)
mylist
是Tuple3
而不是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)