Лучший способ проверить значение Опциона?
-
05-07-2019 - |
Вопрос
Я часто сталкиваюсь с 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"))
У кого-нибудь есть лучший способ сделать этот тест?
Решение
Как насчет
if (opt == Some("lakes"))
Это ясно выражает намерение и является прямым.
Другие советы
В Scala 2.11 вы можете использовать Some (foo) .contains (bar)
Уолтер Чанг, но вот еще одна неловкая альтернатива:
Some(2) exists (_ == 2)
val opt = Some("oxbow")
opt match {
case Some("lakes") => //Doing something
case _ => //If it doesn't match
}
Вы также можете использовать для понимания:
for {val v <- opt if v == "lakes"}
// do smth with v
Я думаю, что сопоставление с образцом также может быть использовано. Таким образом, вы извлекаете интересное значение напрямую:
val opt = Some("oxbow")
opt match {
case Some(value) => println(value) //Doing something
}