过滤无值的映射

时间:2012-08-07 21:30:10

标签: scala functional-programming hashmap filtering

我已经搜索了一下,但还没有找到一个很好的答案,关于如何将任何条目过滤到地图中的值为None。说我有这样的地图:

val map = Map[String, Option[Int]]("one" -> Some(1), 
                                   "two" -> Some(2), 
                                   "three" -> None)

我想最后只返回("one", Some(1))("two", Some(2))对的地图。我知道当你有一个列表时,这是通过展平来完成的,但是我不确定如何在不将它分成键和值的情况下在地图上实现效果,然后尝试重新加入它们。

3 个答案:

答案 0 :(得分:48)

如果您要过滤掉None个值,您也可以同时提取Some值,最后得到Map[String,Int]

scala> map.collect { case (key, Some(value)) => (key, value) }
res0: scala.collection.immutable.Map[String,Int] = Map(one -> 1, two -> 2)

答案 1 :(得分:35)

与scala.collection命名空间中的每个集合类型一样,Map定义了filter方法,Option具有isDefined方法,true Some的{​​{1}}和false的{​​{1}}。您可以通过组合这两个来过滤掉None值:

None

答案 2 :(得分:6)

另外 map.filterKeys( map(_) != None)

for( (k,v) <- map if( v!= None)) yield (k,v)

这种方法提供了一种在地图上不存在的通用filterValues方法 我想念这样一种方法,因为没有一种方法是完美的。

[稍后更新]这是一个更好的版本,不会对每个条目进行查找,仍然可以清楚地读取。

map.filter( {case (x,y)=> y!=None})