我有Map[A, Option[B]]
,获得Map[A, B]
的最佳方法是什么?
我知道列表我们可以使用flatten,但这个结构是不同的
答案 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)