在进行相等测试时,Scala选项的成语

Tre*_*ton 9 scala

什么是更简单/更清洁的方法呢?

val o = Some(4)
if(o.isDefined) {o.get == 4} else { false }
Run Code Online (Sandbox Code Playgroud)

我试过了

o.getOrElse(null) == 4
Run Code Online (Sandbox Code Playgroud)

但这感觉不对,因为在isEmpty的情况下,你最终会对另一方测试null ...这本身可能是null.我需要它,如果opt定义&& opt.get ==等等.我觉得Option上的一些方法应该只是一个函数,我可以这样做:

o.test( (x) => x == 4 )
Run Code Online (Sandbox Code Playgroud)

并且仅在o.isDefined时才应用该函数.

Rok*_*alj 18

这是最干净,最惯用的方式.

val o = Some(4)
o.contains(4) // true
o.contains(5) // false
Run Code Online (Sandbox Code Playgroud)

还有一个谓词版本:

val o = Some(4)
o.exists(_ > 0) // true
o.exists(_ > 100) // false
Run Code Online (Sandbox Code Playgroud)

如果contains不够强,则仅使用谓词版本.


oxb*_*kes 9

你也可以使用:

if (o == Some(4)) //do something
Run Code Online (Sandbox Code Playgroud)


Dav*_*low 7

这似乎对我来说相当干净:

o.map(4==).getOrElse(false)
Run Code Online (Sandbox Code Playgroud)

如果需要,您甚至可以添加隐式转换以为此添加便捷方法:

implicit def richOption[A](o: Option[A]) = new {
  def test(p: A => Boolean): Boolean = o.map(p).getOrElse(false)
}
Run Code Online (Sandbox Code Playgroud)


Ran*_*ulz 5

这个怎么样:

val o = Some(4)
o match {
  case Some(4) => true
  case _ => false
}
Run Code Online (Sandbox Code Playgroud)