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

oxb*_*kes 29 scala code-readability option

我经常发现自己有一种Option[T]类型,T并希望测试选项的价值对某些价值.例如:

val opt = Some("oxbow")
if (opt.isDefined && opt.get == "lakes") 
   //do something
Run Code Online (Sandbox Code Playgroud)

以下代码是等效的,并删除了测试选项值是否存在的要求

if (opt.map(_ == "lakes").getOrElse(false))
 //do something
Run Code Online (Sandbox Code Playgroud)

然而,这对我来说似乎不太可读.其他可能性是:

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

if (opt.find(_ == "lakes").isDefined) //uses implicit conversion to Iterable
Run Code Online (Sandbox Code Playgroud)

但我不认为这些明确表达的意图要么更好,因为:

if (opt.isDefinedAnd(_ == "lakes"))
Run Code Online (Sandbox Code Playgroud)

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

Wal*_*ang 41

怎么样

if (opt == Some("lakes"))
Run Code Online (Sandbox Code Playgroud)

这清楚地表达了意图并且是直截了当的.

  • 即使`opt`不是选项,这还不会编译吗? (2认同)

小智 20

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


Dan*_*ral 14

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

Some(2) exists (_ == 2)
Run Code Online (Sandbox Code Playgroud)

  • 丹尼尔,这太可怕了!``:-) (4认同)
  • 也许包含应该直接添加到Option中. (3认同)
  • 就我而言,这实际上是标准方式. (2认同)
  • 遗憾的是Option没有隐式转换为`Seq`,这将允许`Some(1)包含1`. (2认同)

Ken*_*oom 5

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