2013-04-26 20 views
48

C'è un modo, usando solo l'API della raccolta Scala, per ottenere un'opzione in un elenco quando si cerca di ottenere un elemento dal suo indice?Come ottenere un'opzione dall'indice in Collection in Scala?

Sto cercando l'equivalente di questa funzione, esiste?

def optionalValue[T](l: List[T], index: Int) = { 
    if (l.size < (index+1)) None 
    else Some(l(index)) 
} 

Grazie

risposta

104

Sì, si può sollevare la vostra collezione a una funzione Int => Option[A]:

scala> List(1,2,3).lift 
res0: Int => Option[Int] = <function1> 

scala> List(1,2,3).lift(9) 
res1: Option[Int] = None 
+0

Nizza! grazie! – Loic

+10

Ho già visto 'lift' per un sacco di strutture dati in Scala, qual è la logica alla base della denominazione (e dell'astrazione)? – kosii

+2

@kosii forse un po 'in ritardo con la risposta, ma in questo caso "lift" si riferisce alla trasformazione da una funzione parziale di tipo 'Int => T' a una funzione totale di tipo' Int => Opzione [T] '. È un termine abbastanza comune per trasformare da qualcosa di meno generale a qualcosa di più generale o, in altre parole, "aggiungere" una nuova struttura, ad es. trasformare una monade in un trasformatore monade o trasformare un functor in una monade libera. Penso che il termine sia venuto dalla teoria delle categorie, ma non sono riuscito a trovare riferimenti precisi. –