Question

Je me trouve souvent avec un option [T] pour un type T et je souhaite tester la valeur de l'option par rapport à une valeur. Par exemple:

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

Le code suivant est équivalent et supprime l'obligation de tester l'existence de la valeur de l'option

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

Cependant, cela me semble moins lisible. Les autres possibilités sont les suivantes:

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

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

Mais je ne pense pas que ceux-ci expriment clairement l'intention non plus, ce qui serait mieux comme:

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

Quelqu'un at-il une meilleure façon de faire ce test?

Était-ce utile?

La solution

Que diriez-vous de

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

Ceci exprime clairement l’intention et est simple.

Autres conseils

Pour Scala 2.11, vous pouvez utiliser Some (foo) .contains (bar)

Walter Chang FTW, mais voici une autre alternative peu pratique:

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

Vous pouvez également utiliser pour la compréhension:

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

Je pense que le filtrage par motif pourrait également être utilisé. De cette façon, vous extrayez directement la valeur intéressante:

val opt = Some("oxbow")
opt match {
  case Some(value) => println(value) //Doing something
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top