2013-01-17 6 views

risposta

25

Nota che

list.flatten 

Will fare altrettanto bene.

6

Sì, è possibile utilizzare collect per questo:

list.collect { case Some(x) => x } 

collect prende un PartialFunction[A,B] e si applica questa funzione per tutti gli elementi su cui si è definita e scarta il resto.

modificare:

Come gpampara correttamente citato, per questo caso flatten sarà sufficiente. collect sarebbe lo strumento giusto se ci fossero ulteriori vincoli e/o trasformazioni.

+0

Grazie. Puoi contare su Scala che c'è sempre un modo più elegante ;-) – deamon

+2

Un modo ancora più elegante è semplicemente: 'list.flatten' – gpampara

+0

@gpampara Grazie, mi hai dimostrato :-) – deamon

4

È anche possibile utilizzare:

list.flatMap(x => x) 

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

scala> a.flatMap(x => x) 
res0: List[Int] = List(1, 2) 

Per la spiegazione di come/perché questo funziona, si potrebbe controllare questo articolo: http://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/

+0

Sì, funziona. Ma non capisco perché. Secondo i documenti 'flatMap' deve restituire' Opzione'. – deamon

+1

http://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/ Ecco una buona spiegazione – Arg

+0

Il mio errore è stato guardare 'flatMap' su la classe 'Option', ma ovviamente dovevo dare un'occhiata a' List.flatMap'. – deamon

Problemi correlati