测试期权价值的更好方法是什么?

时间:2009-10-23 07:31:24

标签: scala option code-readability

对于某些类型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 个答案:

答案 0 :(得分:42)

怎么样

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

这清楚地表达了意图并且很直接。

答案 1 :(得分:20)

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

答案 2 :(得分:14)

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

Some(2) exists (_ == 2)

答案 3 :(得分:3)

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

答案 4 :(得分:1)

你也可以使用for-understanding:

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

答案 5 :(得分:-1)

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

val opt = Some("oxbow")
opt match {
  case Some(value) => println(value) //Doing something
}
相关问题