2016-02-09 10 views
5

Sto sviluppando del codice utilizzando Scala e sto cercando di risolvere in modo intelligente una trasformazione di base tra raccolte che contiene alcuni Option[T].Gestisci in modo intelligente l'opzione [T] in Scala

Diciamo che abbiamo il seguente elenco

val list: List[(A, Option[B])] = // Initialization stuff 

e vogliamo applicare una trasformazione a list per ottenere la seguente lista

val transformed: List[(B, A)] 

per tutti Option[B] s che restituiscono Some[B]. Il modo migliore che ho trovato per farlo è quello di applicare la seguente catena di trasformazioni:

val transformed = 
    list.filter(_.isDefined) 
     .map { case (a, Some(b)) => (b, a) } 

Tuttavia sento che mi manca qualcosa. Qual è il modo migliore per gestire lo Option[T] s?

risposta

13

È possibile utilizzare collect:

val transformed = list.collect { 
    case (a, Some(b)) => (b, a) 
} 

Collect, come definito nella documentazione:

costruisce una nuova collezione applicando una funzione parziale a tutti gli elementi di questa lista in cui la funzione è definito.

Significato, restituisce un risultato solo per gli elementi che corrispondono a uno qualsiasi dei casi definiti nella funzione parziale. Mi piace considerarlo come un combinato filter e map.

Problemi correlati