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?

È stato utile?

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
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top