展平选项地图以映射

时间:2015-09-15 15:23:14

标签: scala

我有Map[A, Option[B]],获得Map[A, B]的最佳方法是什么?

我知道列表我们可以使用flatten,但这个结构是不同的

2 个答案:

答案 0 :(得分:15)

嗯,它们不一样,所以你需要一种方法来定义如果值为None会发生什么。我假设您要忽略这些键,如果是这样,您可以使用部分函数进行收集:

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

或使用for-comprehension

  for ((k, Some(v)) <- map) yield k -> v

答案 1 :(得分:1)

如果你不介意双重迭代:

map.filter(_._2.nonEmpty).mapValues(_.get)

示例:

scala> Map(1 -> Some(1), 2 -> None).filter(_._2.nonEmpty).mapValues(_.get)
res9: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1)

或者使用这个隐含的:

implicit def flat[K,V](kv: (K, Option[V])) = kv._2.map(kv._1 -> _).toList

然后:

map.flatten.toMap

或者不使用(可能不安全)隐式:

map flatMap flat

示例:

scala> Map(1 -> Some(1), 2 -> None).flatten.toMap
res2: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1)

scala> def flat[K,V](kv: (K, Option[V])) = kv._2.map(kv._1 -> _).toList 
warning: there was one feature warning; re-run with -feature for details
flat: [K, V](kv: (K, Option[V]))List[(K, V)]

scala> Map(1 -> Option(1), 2 -> None).flatMap(flat)
res29: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1)