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

时间:2009-11-24 19:56:55

标签: scala

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

val o = Some(4)
if(o.isDefined) {o.get == 4} else { false }

我试过

o.getOrElse(null) == 4

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

o.test( (x) => x == 4 )

只有o.isDefined才会应用该函数。

7 个答案:

答案 0 :(得分:16)

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

val o = Some(4)
o.contains(4) // true
o.contains(5) // false

还有一个谓词版本:

val o = Some(4)
o.exists(_ > 0) // true
o.exists(_ > 100) // false

如果contains不够强,请仅使用谓词版本。

答案 1 :(得分:9)

你也可以使用:

if (o == Some(4)) //do something

答案 2 :(得分:7)

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

o.map(4==).getOrElse(false)

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

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

答案 3 :(得分:5)

这个怎么样:

val o = Some(4)
o match {
  case Some(4) => true
  case _ => false
}

答案 4 :(得分:2)

如果您不关心对象创建开销,以下对我来说似乎最直观。

val o = Some(4)
Some(4) == o

另一种未提及的方法

val o = Some(4)
val Some(x) = o; x==4 // Edit: will not compile of o = None

答案 5 :(得分:1)

o.map(_ == 4).getOrElse(false)

答案 6 :(得分:1)

试试这个:

val o = Some(4)
o.exists(4 == _)