如何将映射[K,Option[V]]转换为映射[K,V],从而丢弃Scala中的Nones?

如何将映射[K,Option[V]]转换为映射[K,V],从而丢弃Scala中的Nones?,scala,scala-collections,Scala,Scala Collections,可能重复: 我有一个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) } 但是我真的不喜欢案例,

可能重复:

我有一个
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) }
但是我真的不喜欢
案例
,不得不重新构建

有人能找到更好的表达方式吗

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

m collect {case(a, Some(b)) => (a, b)}
  // Map('a -> a string)
看起来很有意思


似乎很管用。

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

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

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

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

看见您可以将您的案例改写为简单的
case(k,Some(v))=>(k,v)
。您完全正确,希望SO dup finder能像人们一样工作。投票结束。请参阅。您可以将您的案例改写为简单的
case(k,Some(v))=>(k,v)
。您完全正确,希望SO dup finder能像人们一样工作。投票决定关闭。它是()但听起来OP更希望没有案例,而不是构建一对。不用这个箱子可能是可行的,但很不方便,我不确定一个人不使用普通的环就可以不用这双。不,我不介意箱子是否像那样优雅!是的(),但听起来OP更希望没有案例,而不是构建一对。不用这个箱子可能是可行的,但很不方便,我不确定一个人不使用普通的环就可以不用这双。不,我不介意箱子是否像那样优雅!回答得好!您不需要在
符号上添加类型注释,但是:
对于((k,Some(v))是的,您当然是对的。我不适合显式键入)回答得好!您不需要在
符号上添加类型注释,但是:
对于((k,Some(v))是的,您当然是对的。我不适合显式键入))