如何将Map [K,Option [V]]转换为Map [K,V],在Scala中丢弃Nones?

时间:2011-10-10 14:51:09

标签: scala scala-collections

  

可能重复:
  Better way of converting a Map[K, Option[V]] to a Map[K,V]

我从网页上读取值时有一个Map[Symbol, Option[String]],其中一些可能会丢失。

我想将此“展平”为Map[Symbol, String],删除所有None值。

我能做的最好的事情是

def removeNones[K, V](map: Map[K, Option[V]]): Map[K, V] = 
    map.collect { case kv if kv._2.isDefined => (kv._1, kv._2.get) }

但我真的不喜欢case,并且不得不重建Pair

有人能找到更好的表达吗?

2 个答案:

答案 0 :(得分:9)

val m = Map('a -> Some("a string"), 'b -> None)

m collect {case(a, Some(b)) => (a, b)}
  // Map('a -> a string)

似乎可以解决问题。

答案 1 :(得分:3)

我认为更优雅的方式是这样的:

val map1 = Map('a -> Some("a"), 'b -> None)
val map2 = for ((k: Symbol, Some(v)) <- map1) yield (k,v)

让我们打印结果:

Predef println  map2
> Map('a -> a)