Eine bessere Möglichkeit, den Wert einer Option zu testen?
-
05-07-2019 - |
Frage
Ich bin oft mit einem Option[T]
für irgendeine Art T
und möchte den Wert der Option gegen einen Wert testen. Zum Beispiel:
val opt = Some("oxbow")
if (opt.isDefined && opt.get == "lakes")
//do something
Der folgende Code ist gleichwertig und beseitigt die Anforderung, die zu testen Existenz des Wertes der Option
if (opt.map(_ == "lakes").getOrElse(false))
//do something
Dies scheint mir jedoch weniger lesbar zu sein. Andere Möglichkeiten sind:
if (opt.filter(_ == "lakes").isDefined)
if (opt.find(_ == "lakes").isDefined) //uses implicit conversion to Iterable
Aber ich glaube nicht, dass diese die Absicht auch eindeutig ausdrücken, was besser wäre als:
if (opt.isDefinedAnd(_ == "lakes"))
Hat jemand eine bessere Möglichkeit, diesen Test zu machen?
Lösung
Wie wäre es mit
if (opt == Some("lakes"))
Dies drückt die Absicht klar aus und ist einfach.
Andere Tipps
Für Scala 2.11 können Sie verwenden Some(foo).contains(bar)
Walter Chang FTW, aber hier ist eine weitere unangenehme Alternative:
Some(2) exists (_ == 2)
val opt = Some("oxbow")
opt match {
case Some("lakes") => //Doing something
case _ => //If it doesn't match
}
Sie können auch für den Verständnis einsetzen:
for {val v <- opt if v == "lakes"}
// do smth with v
Ich denke, Musteranpassung könnte auch verwendet werden. Auf diese Weise extrahieren Sie den interessanten Wert direkt:
val opt = Some("oxbow")
opt match {
case Some(value) => println(value) //Doing something
}