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

时间:2011-10-06 20:29:52

标签: scala collections

我有一些代码生成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
  }

哪个有效,但似乎不优雅。我怀疑这个内置于收藏库中的内容是我所遗漏的。

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

3 个答案:

答案 0 :(得分:40)

input.collect{case (k, Some(v)) => (k,v)}

答案 1 :(得分:10)

input flatMap {case(k,ov) => ov map {v => (k, v)}}

答案 2 :(得分:7)

for ((k, Some(v)) <- input) yield (k, v)

这是franza在后来的问题中给出的答案,但它值得重新发布。