Подтвердить что ты не робот

Лучший способ преобразования карты [K, Option [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
  }

который работает, но кажется неэлегантным. Я подозреваю, что что-то для этого встроено в библиотеку коллекций, которую мне не хватает.

Есть ли что-то встроенное или более идиоматический способ выполнить это?

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Это ответ franza из более позднего вопроса, но он заслуживает повторной публикации здесь.