29

我经常发现自己有一个Option[T]for 某种类型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"))

有没有人有更好的方法来做这个测试?

4

6 回答 6

44

怎么样

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

这清楚地表达了意图并且直截了当。

于 2009-10-23T07:46:22.823 回答
24

对于 Scala 2.11,您可以使用Some(foo).contains(bar)

于 2014-06-30T17:13:20.350 回答
16

Walter Chang FTW,但这是另一个尴尬的选择:

Some(2) exists (_ == 2)
于 2009-10-23T13:39:16.457 回答
5
val opt = Some("oxbow")
opt match {
  case Some("lakes") => //Doing something
  case _ => //If it doesn't match
}
于 2009-10-28T03:22:37.843 回答
1

您也可以使用 for-comprehension:

for {val v <- opt if v == "lakes"}
  // do smth with v
于 2009-10-23T10:05:56.423 回答
-1

我认为也可以使用模式匹配。这样您就可以直接提取有趣的值:

val opt = Some("oxbow")
opt match {
  case Some(value) => println(value) //Doing something
}
于 2009-10-23T10:14:36.350 回答