Pregunta

A menudo me encuentro con una Opción [T] para algún tipo de T y deseo probar el valor de la opción contra algún valor. Por ejemplo:

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

El siguiente código es equivalente y elimina el requisito de probar la existencia del valor de la opción

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

Sin embargo, esto me parece menos legible. Otras posibilidades son:

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

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

Pero tampoco creo que esto exprese claramente la intención, lo que sería mejor como:

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

¿Alguien tiene una mejor manera de hacer esta prueba?

¿Fue útil?

Solución

¿Qué tal

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

Esto expresa la intención claramente y es sencillo.

Otros consejos

Para Scala 2.11, puedes usar Some(foo).contains(bar)

Walter Chang FTW, pero aquí hay otra alternativa incómoda:

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

También puedes usar para comprensión:

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

Creo que también podría usarse la coincidencia de patrones. De esa manera usted extrae el valor interesante directamente:

val opt = Some("oxbow")
opt match {
  case Some(value) => println(value) //Doing something
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top