Лучший способ конвертировать карту [K, вариант [V]] в карту [K, V] - PullRequest
19 голосов
/ 07 октября 2011

У меня есть некоторый код, который создает 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 ]

40 голосов
/ 07 октября 2011
input.collect{case (k, Some(v)) => (k,v)}
10 голосов
/ 07 октября 2011
input flatMap {case(k,ov) => ov map {v => (k, v)}}
7 голосов
/ 11 октября 2011
for ((k, Some(v)) <- input) yield (k, v)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...