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?

War es hilfreich?

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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top