martedì 21 giugno 2011

Option è un container (e una monade)!

Supponiamo di avere una lista di Option:
val myList = List( 
                   Some(1), 
                   Some(4), 
                   None, 
                   Some(5) 
                  )
e volete solo i valori, quindi List(1, 4, 5). Qualche volta trovate codice analogo al seguente, magari scritto da me l'anno scorso :)
val values = myList filter (! _.isEmpty) map (_.get)
assert( values == List(1, 4, 5) )
Orribile!
Infatti, essendo Option un container possiamo (e dobbiamo) fare questo:
val values = myList.flatten
assert( values == List(1, 4, 5) )
o, al massimo:
val values = for( 
                 Some(a) <- myList 
                ) yield a

Nessun commento: