Un modo migliore per testare il valore di un'opzione?
-
05-07-2019 - |
Domanda
Mi trovo spesso con un'opzione [T]
per un certo tipo T
e desidero testare il valore dell'opzione con un valore. Ad esempio:
val opt = Some("oxbow")
if (opt.isDefined && opt.get == "lakes")
//do something
Il seguente codice è equivalente e rimuove il requisito per testare la esistenza del valore dell'opzione
if (opt.map(_ == "lakes").getOrElse(false))
//do something
Tuttavia, questo mi sembra meno leggibile. Altre possibilità sono:
if (opt.filter(_ == "lakes").isDefined)
if (opt.find(_ == "lakes").isDefined) //uses implicit conversion to Iterable
Ma non credo che questi esprimano chiaramente l'intento che sarebbe meglio come:
if (opt.isDefinedAnd(_ == "lakes"))
Qualcuno ha un modo migliore di fare questo test?
Soluzione
Che ne dici
if (opt == Some("lakes"))
Questo esprime chiaramente l'intenzione ed è semplice.
Altri suggerimenti
Per Scala 2.11, puoi usare Some(foo).contains(bar)
Walter Chang FTW, ma ecco un'altra alternativa imbarazzante:
Some(2) exists (_ == 2)
val opt = Some("oxbow")
opt match {
case Some("lakes") => //Doing something
case _ => //If it doesn't match
}
Puoi usare anche la comprensione:
for {val v <- opt if v == "lakes"}
// do smth with v
Penso che potrebbe essere usato anche il pattern matching. In questo modo estrai direttamente il valore interessante:
val opt = Some("oxbow")
opt match {
case Some(value) => println(value) //Doing something
}