将Map [K,Option [V]]转换为Map [K,V]的更好方法

Don*_*oby 19 collections scala

我有一些代码产生Map值是Option类型的地方,我当然想要一个只包含实际值的地图.

所以我需要转换它,我在代码中提出的是

  def toMap[K,V](input: Map[K, Option[V]]): Map[K, V] = {
    var result: Map[K, V] = Map()
    input.foreach({
      s: Tuple2[K, Option[V]] => {
        s match {
          case (key, Some(value)) => {
            result += ((key, value))
          }
          case _ => {
            // Don't add the None values
          }
        }
      }
    })
    result
  }
Run Code Online (Sandbox Code Playgroud)

哪个有效,但看起来不够优雅.我怀疑这个内置于我缺少的馆藏库中的东西.

是否有内置的东西,或更实用的方法来实现这一目标?

Did*_*ont 40

input.collect{case (k, Some(v)) => (k,v)}
Run Code Online (Sandbox Code Playgroud)


Tom*_*icz 10

input flatMap {case(k,ov) => ov map {v => (k, v)}}
Run Code Online (Sandbox Code Playgroud)


Lui*_*hys 7

for ((k, Some(v)) <- input) yield (k, v)
Run Code Online (Sandbox Code Playgroud)

从后来的问题来看,这是franza的答案,但值得重新发布.