Ho un Map[A, Option[B]]
, qual è il modo ottimale per rendere un appiattimento per ottenere un Map[A, B]
?Appiattisci una mappa dell'opzione per mappare
so per una lista possiamo usare appiattire, ma tale struttura è diverso
Ho un Map[A, Option[B]]
, qual è il modo ottimale per rendere un appiattimento per ottenere un Map[A, B]
?Appiattisci una mappa dell'opzione per mappare
so per una lista possiamo usare appiattire, ma tale struttura è diverso
Beh, non sono gli stessi, quindi sarà necessario un modo per definire che cosa succede se un valore è Nessuno. Presumo che si desidera ignorare quelle chiavi, in caso affermativo, è possibile raccogliere con una funzione parziale:
map.collect {
case (k, Some(v)) => k -> v
}
o utilizzare un per-comprensione
for ((k, Some(v)) <- map) yield k -> v
Se non ti dispiace doppio di iterazione:
map.filter(_._2.nonEmpty).mapValues(_.get)
Esempio:
scala> Map(1 -> Some(1), 2 -> None).filter(_._2.nonEmpty).mapValues(_.get)
res9: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1)
Oppure utilizza questo implicito:
implicit def flat[K,V](kv: (K, Option[V])) = kv._2.map(kv._1 -> _).toList
Poi:
map.flatten.toMap
O senza usare (potenzialmente pericoloso) implicito:
map flatMap flat
Esempio:
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)
Vale la pena notare che 'mapValues' restituisce una vista sulla mappa, che probabilmente non è ciò che l'OP vuole. – jhn
@jhn dipende, se il codice all'interno di mapValues è referenziale-trasparente come nella mia risposta, perché dovrebbe interessare qualcuno? Per la serializzazione Java (se la si utilizza ancora per qualche motivo), c'è sempre .view.force o .map (identità) – dk14
Perché a qualcuno dovrebbe importare? Prestazione. – jhn
sì non ho precisato che non voglio chiave con valore None, grazie mille per la tua risposta! – nam
effettivamente 'for ((k, Some (v)) <- map) resa k -> v' è abbastanza – dk14
molto vero! Aggiornerò! Quel modello corrisponde sopra e non sotto, idiota ... –