2010-08-26 12 views
24

Esiste un metodo Scala API per convertire un Seq[Option[T]] -> Seq[T]?Scala ha un metodo API che converte un Seq [Opzione [T]] in Seq [T]?

È possibile eseguire questa operazione manualmente tramite:

seq.filter(_.isDefined).map(_.get) 

chiedevo se esiste un metodo che fa la sopra nella API generale.

+1

'' filter' + map' può essere ridotto a 'collect' che prende funzione parziale come parametro. – tiran

risposta

41

Assolutamente, positivamente no. (Non!)

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

scala> so1.flatten 
res0: List[Int] = List(1, 2, 3) 
+0

no? (15 caratteri) –

+2

Sorprendentemente so1.flapMap (r => r) funziona anche. Questo sembra essere dovuto al fatto che l'Opzione può essere convertita in un iterabile attraverso: opzione implicita def2Iterable [A] (xo: Option [A]): ​​Iterable [A] = xo.toList. Quando xo.toList è chiamato solo Some (X) genera un valore di lista. Nessuno dà una lista(). Flatmap fa il resto. – ssanj

+9

Non così sorprendente, perché 'flatMap (fun)' == 'map (fun) .flatten'. – Debilski

Problemi correlati