Ответ 1
input.collect{case (k, Some(v)) => (k,v)}
У меня есть код, который создает 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
}
который работает, но кажется неэлегантным. Я подозреваю, что что-то для этого встроено в библиотеку коллекций, которую мне не хватает.
Есть ли что-то встроенное или более идиоматический способ выполнить это?
input.collect{case (k, Some(v)) => (k,v)}
input flatMap {case(k,ov) => ov map {v => (k, v)}}
for ((k, Some(v)) <- input) yield (k, v)
Это ответ franza из более позднего вопроса, но он заслуживает повторной публикации здесь.