我已经搜索了一下,但还没有找到一个很好的答案,关于如何将任何条目过滤到地图中的值为None。说我有这样的地图:
val map = Map[String, Option[Int]]("one" -> Some(1),
"two" -> Some(2),
"three" -> None)
我想最后只返回("one", Some(1))
和("two", Some(2))
对的地图。我知道当你有一个列表时,这是通过展平来完成的,但是我不确定如何在不将它分成键和值的情况下在地图上实现效果,然后尝试重新加入它们。
答案 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})