过滤无值的映射

KCh*_*oux 33 functional-programming filtering scala hashmap

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

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

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

Kri*_*ala 52

如果您要过滤掉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)
Run Code Online (Sandbox Code Playgroud)


dre*_*xin 36

像在scala.collection名称空间中的每一个收集型Map具有filter定义的方法和Option具有所述isDefined方法,这是trueSomefalse进行None.您可以None通过组合这两个来过滤掉这些值:

scala> map.filter(_._2.isDefined)
res4: scala.collection.immutable.Map[String,Option[Int]] = Map(one -> Some(1), two -> Some(2))
Run Code Online (Sandbox Code Playgroud)

  • @KChaloux在这种情况下,`_`指的是传递给`filter`方法的函数文字的第一个参数.它是`x => x._2.isDefined`的简写 (2认同)

Con*_*orR 6

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

要么

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

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

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

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