2009-10-23 5 views
22

Ich finde mich oft mit einem Option[T] für einen Typ T und möchte den Wert der Option gegen einen Wert testen. Zum Beispiel:Eine bessere Möglichkeit, den Wert einer Option zu testen?

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

Der folgende Code entspricht und beseitigt die Notwendigkeit, die Existenz des Wertes der Option zu testen

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

Allerdings scheint dies weniger lesbar zu mir. Andere Möglichkeiten sind:

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

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

Aber ich glaube nicht, diese klar zum Ausdruck bringen, die Absicht entweder die besser wäre als:

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

Hat jemand einen besseren Weg, diesen Test zu tun?

Antwort

37

Wie wäre es

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

Dadurch wird die Absicht zum Ausdruck bringt klar und geradlinig ist.

+1

Duh verwenden können! Manchmal kann ich extrem dumm sein –

+0

Nun, es passiert mir die ganze Zeit ;-) –

+0

Manchmal ist die einfachste Lösung die beste :) –

1

Sie können auch für Verständnis verwenden:

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

I Pattern-Matching denken könnte auch verwendet werden. So kann man den interessanten Wert extrahieren direkt:

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

Dies wird nicht gegen den Wert getestet - nur, dass es vorhanden ist. Der Grund, warum ich eine "Übereinstimmung" vermeiden möchte, ist, dass dies dazu führt, dass die "else" -Logik an mehreren Stellen liegt (dh der 'case None' und wenn der Wert nicht der gewünschte ist) –

14

Walter Chang FTW, aber hier ist eine andere peinliche Alternative:

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

Daniel, das ist * schrecklich * ! ':-)' –

+0

Ich mag das eigentlich; vermeidet eine Kreation und ein Nichtanwenden, und ist dennoch prägnant – HRJ

+1

Dies ist eigentlich der Standardweg, soweit es mich betrifft. – extempore

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

Für Scala 2.11, Sie Some(foo).contains(bar)

Verwandte Themen