2009-10-23 3 views
22

Я часто встречаюсь с Option[T] для некоторого типа T и хочу проверить значение параметра на некоторое значение. Например:Лучший способ проверить значение параметра?

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

Следующий код эквивалентен и снимает требование, чтобы проверить наличие стоимости опциона

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

Однако это кажется менее читаемым мне. Другие возможности:

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

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

Но я не думаю, что они ясно выражают намерение либо что было бы лучше, как:

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

Кто-нибудь есть лучший способ сделать это испытание?

ответ

37

Как насчет

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

Это выражает намерение ясно и прямо вперед.

+1

ДУХ! Иногда я могу быть очень глупым –

+0

Ну, это случается со мной все время ;-) –

+0

Иногда самое простое решение - лучшее :) –

1

Вы можете использовать для понимания, а также:

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

Я думаю, что сравнение с шаблоном также может быть использован. Таким образом, вы извлечь интересное значение непосредственно:

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

Это не проверяет значение - только оно присутствует. Причина, по которой я хочу избежать «совпадения», заключается в том, что это приводит к тому, что логика 'else' находится в нескольких местах (например,« case None »и если значение не является желательным) –

14

Walter Chang FTW, но вот еще одна неловкая альтернатива:

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

Daniel, то есть * awful * ! ':-)' –

+0

Мне это действительно нравится; избегает одного создания и не подходит, и все же является кратким. – HRJ

+1

Это на самом деле стандартный способ, насколько я могу судить. – extempore

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

Для Scala 2.11, Вы можете использовать Some(foo).contains(bar)