如果选项包含特定值,则以惯用方式评估true

时间:2014-10-02 16:17:54

标签: scala

如果true包含特定值,我想写一个返回Option[Int]的方法,否则返回false。这样做的惯用方法是什么?

var trueIf5(intOption: Option[Int]): Boolean {
  intOption match {
    case Some(i) => i == 5
    case None => false
  }
}

上述解决方案显然有效,但Scala文档将此方法标记为less-idiomatic

我是否可以使用mapfilter或其他方式做同样的事情?

我做到了这一点,但它只会将问题更改为“如果选项包含true则返回true”,这实际上与“如果选项包含5则返回true”相同。

var trueIf5(intOption: Option[Int]): Boolean {
  intOption.map(i => i == 5).???
}

3 个答案:

答案 0 :(得分:14)

因为您正在测试它是否包含值:

scala> Some(42) contains 42
res0: Boolean = true

不要忽视你的-Xlint

scala> Option(42).contains("")
res0: Boolean = false

scala> :replay -Xlint
Replaying: Option(42).contains("")
<console>:12: warning: a type was inferred to be `Any`; this may indicate a programming error.
       Option(42).contains("")
                           ^
res0: Boolean = false

这些内置警告在普遍平等方面并不有效:

scala> Option(42).exists("" == _)    // no warning
res1: Boolean = false

答案 1 :(得分:12)

intOption.exists(_ == 5)

The doc

答案 2 :(得分:3)

为什么没有人建议:

intOption == Some(5)