2015-09-15 19 views

risposta

13

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 
+0

sì non ho precisato che non voglio chiave con valore None, grazie mille per la tua risposta! – nam

+1

effettivamente 'for ((k, Some (v)) <- map) resa k -> v' è abbastanza – dk14

+0

molto vero! Aggiornerò! Quel modello corrisponde sopra e non sotto, idiota ... –

1

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) 
+0

Vale la pena notare che 'mapValues' restituisce una vista sulla mappa, che probabilmente non è ciò che l'OP vuole. – jhn

+0

@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

+0

Perché a qualcuno dovrebbe importare? Prestazione. – jhn

Problemi correlati