2013-05-22 16 views
7

Ho una collezione di Option[T] e ora voglio estrarre i valori da essa. Ma voglio anche che la nuova collezione escluda None s.Converti Seq [Opzione [T]] in Seq [T]

val foo = List(None, None, Some(1), None, Some(2)) 

La prima idea è venuta in mente è map, ma è un po 'poco intuitivo.

foo.map(o => o.get) // Exception! 
foo.map(o => o.getOrElse(null)).filterNot(_ == null) // List(1, 2), works but not elegant 

Esiste un modo più semplice per ottenere questo comportamento?

+6

flatMappa quella merda :) –

risposta

22

Uso flatten metodo:

scala> val foo = List(None, None, Some(1), None, Some(2)) 
foo: List[Option[Int]] = List(None, None, Some(1), None, Some(2)) 

scala> foo.flatten 
res0: List[Int] = List(1, 2) 

solo per essere completa, v'è anche flatMap metodo:

foo.flatMap(x => x) 

e-comprensione:

scala> for(optX <- foo; x <- optX) yield x 
res1: List[Int] = List(1, 2) 

e raccogliere (si comporta come filtro + mappa):

scala> foo.collect { case Some(x) => x } 
res2: List[Int] = List(1, 2)