Scala'的习惯用法;在进行相等性测试时,选择s选项

Scala'的习惯用法;在进行相等性测试时,选择s选项,scala,Scala,哪种方法更容易/更干净 val o = Some(4) if(o.isDefined) {o.get == 4} else { false } 我试过了 o.getOrElse(null) == 4 但这感觉是错误的,因为在isEmpty的情况下,您最终会针对另一方测试null。。。它本身可能是空的。如果定义了opt,我需要它&&opt.get==无论什么。我觉得Option上的某些方法应该只取一个函数,我可以这样做: o.test( (x) => x == 4 ) 只有在定义了o.

哪种方法更容易/更干净

val o = Some(4)
if(o.isDefined) {o.get == 4} else { false }
我试过了

o.getOrElse(null) == 4
但这感觉是错误的,因为在isEmpty的情况下,您最终会针对另一方测试null。。。它本身可能是空的。如果定义了opt,我需要它&&opt.get==无论什么。我觉得Option上的某些方法应该只取一个函数,我可以这样做:

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

只有在定义了o.时,它才会应用该函数。

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

o.map(4==).getOrElse(false)
如果需要,您甚至可以添加隐式转换来添加一个方便的方法:

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

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

如果您不关心对象创建开销,那么以下内容对我来说似乎是最直观的

val o = Some(4)
Some(4) == o
另一种未经证实的方法

val o = Some(4)
val Some(x) = o; x==4 // Edit: will not compile of o = None
您还可以使用:

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

这是最干净、最惯用的方法

val o = Some(4)
o.contains(4) // true
o.contains(5) // false
还有一个谓词版本:

val o = Some(4)
o.exists(_ > 0) // true
o.exists(_ > 100) // false
仅当
包含的
不够强时才使用谓词版本。

尝试以下操作:

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

4后面的“==”的用途是什么?”
4==
“是一个测试与4Scala sugar是否相等的函数。在本例中,4==被视为一个参数的匿名函数。更清楚(但更详细)的可能是:
o.map(4.==)
o.map(\u==4)
o.map(x=>x==4)
。这里的关键点是,传递给Option.map()的任何内容都只在非None选项上进行计算。完全重复:--事实上,这是列出的第一个“相关”问题。我在搜索时没有想到。感谢链接。第二种方法无法解释o为无的情况。噢!编辑以反映。谢谢
val o = Some(4)
o.exists(4 == _)