过滤映射无值

Posted

技术标签:

【中文标题】过滤映射无值【英文标题】:Filter map for values of None 【发布时间】:2012-08-04 23:13:36 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

如果您要过滤掉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)

【讨论】:

【参考方案2】:

与 scala.collection 命名空间中的每个集合类型一样,Map 定义了 filter 方法,Option 具有 isDefined 方法,即 true 用于 Somefalse 用于 @ 987654329@。您可以通过组合这两个来过滤掉None值:

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

【讨论】:

Neato。我不会猜到语法。对_. 仍然有些困惑,据我了解,我们告诉它转到第一个(当前)对的第二项(值)? @KChaloux 在这种情况下,_ 指的是传递给filter 方法的函数文字的第一个参数。这是x => x._2.isDefined的简写 而_2来自Tuple。【参考方案3】:

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

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

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

[稍后更新] 这是一个更好的版本,它不会对每个条目进行查找,并且仍然可以合理清晰地阅读。

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

【讨论】:

以上是关于过滤映射无值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jetty 中的 /* 上映射 servlet 过滤器?

使用异步过滤和映射 Promise

有没有办法忽略映射字符过滤器?

同时映射和过滤数组

web.xml 过滤器如何工作?您可以将两个过滤器映射到所有页面(/ *)并指定顺序吗?

排除子目录的过滤器映射 url 模式