2009-10-23 7 views
22

A menudo me encuentro con un Option[T] para algún tipo T y deseo probar el valor de la opción con algún valor. Por ejemplo:¿Una mejor manera de probar el valor de una Opción?

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 parece menos legible para mí. Otras posibilidades son:

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

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

Pero no creo que éstos expresan claramente la intención sea la que sería mejor como:

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

Alguien tiene una mejor forma de hacer esta prueba?

Respuesta

37

¿Qué tal

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

Esto expresa la intención es clara y sencilla.

+1

Duh! A veces puedo ser extremadamente estúpido –

+0

Bueno, me pasa todo el tiempo ;-) –

+0

A veces la solución más simple es la mejor :) –

1

Se puede utilizar para la comprensión, así:

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

creo que la coincidencia de patrones también se podría utilizar. De esta manera extraer directamente el valor interesante:

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

Esto no prueba contra el valor, solo que está presente. La razón por la que quiero evitar un 'emparejamiento' es que esto resulta en la lógica' else' que reside en múltiples lugares (es decir, el 'caso Ninguno' y si el valor no es el deseado) –

14

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

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

Daniel, eso es * horrible * ! ':-)' –

+0

De hecho me gusta esto; evita una creación y una aplicación, y sin embargo es sucinta – HRJ

+1

Esta es la manera estándar en lo que a mí respecta. – extempore

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

Para Scala 2.11, puede utilizar Some(foo).contains(bar)

Cuestiones relacionadas