Лучший способ проверить значение Опциона? - PullRequest
28 голосов
/ 23 октября 2009

Я часто нахожу себя с 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"))

У кого-нибудь есть лучший способ сделать этот тест?

Ответы [ 6 ]

42 голосов
/ 23 октября 2009

Как насчет

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

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

20 голосов
/ 30 июня 2014

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

14 голосов
/ 23 октября 2009

Уолтер Чанг FTW, но вот еще одна неловкая альтернатива:

Some(2) exists (_ == 2)
3 голосов
/ 28 октября 2009
val opt = Some("oxbow")
opt match {
  case Some("lakes") => //Doing something
  case _ => //If it doesn't match
}
1 голос
/ 23 октября 2009

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

for {val v <- opt if v == "lakes"}
  // do smth with v
0 голосов
/ 23 октября 2009

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

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