2009-10-23 10 views
22

Spesso mi trovo con un Option[T] per un certo tipo T e desidero testare il valore dell'opzione su qualche valore. Per esempio:Un modo migliore per verificare il valore di un'opzione?

val opt = Some("oxbow") 
if (opt.isDefined && opt.get == "lakes") 
    //do something 

Il codice seguente è equivalente e elimina la necessità di verificare l'esistenza del valore dell'opzione

if (opt.map(_ == "lakes").getOrElse(false)) 
//do something 

Tuttavia questo sembra meno leggibile per me. Altre possibilità sono:

if (opt.filter(_ == "lakes").isDefined) 

if (opt.find(_ == "lakes").isDefined) //uses implicit conversion to Iterable 

Ma non credo che questi esprimono chiaramente l'intento sia che sarebbe meglio come:

if (opt.isDefinedAnd(_ == "lakes")) 

chiunque ha un modo migliore di fare questo test?

risposta

37

Come su

if (opt == Some("lakes")) 

Questo esprime l'intento chiaramente ed è semplice.

+1

Duh! A volte posso essere estremamente stupido –

+0

Beh, mi capita sempre ;-) –

+0

A volte la soluzione più semplice è la migliore :) –

1

È possibile utilizzare per la comprensione così:

for {val v <- opt if v == "lakes"} 
    // do smth with v 
-2

Penso pattern matching potrebbe anche essere utilizzato. In questo modo si estrae direttamente il valore interessante:

val opt = Some("oxbow") 
opt match { 
    case Some(value) => println(value) //Doing something 
} 
+0

Questo non prova il valore - solo che è presente. Il motivo per cui voglio evitare un 'match' è che questo di conseguenza si traduce nella logica' else' che risiede in più posti (cioè il 'caso None' e se il valore non è quello desiderato) –

14

Walter Chang FTW, ma qui è un'altra alternativa imbarazzante:

Some(2) exists (_ == 2) 
+2

Daniel, cioè * terribile * ! ':-)' –

+0

In realtà mi piace; evita una creazione e una inapplicabile, eppure è succinta – HRJ

+1

Questo è in realtà il modo standard per quanto mi riguarda. – extempore

2
val opt = Some("oxbow") 
opt match { 
    case Some("lakes") => //Doing something 
    case _ => //If it doesn't match 
} 
18

Per Scala 2.11, è possibile utilizzare Some(foo).contains(bar)

Problemi correlati