我有一个布尔值,并希望避免这种模式:
if (myBool)
Option(someResult)
else
None
我想做的是
myBool.toOption(someResult)
非常感谢任何带有代码示例的建议。
答案 0 :(得分:57)
Scalaz有办法用BooleanOps.option做到这一点。 这将允许你写:
myBool.option(someResult)
如果您不想添加Scalaz依赖项,只需在代码中添加以下内容:
implicit class RichBoolean(val b: Boolean) extends AnyVal {
final def option[A](a: => A): Option[A] = if (b) Some(a) else None
}
答案 1 :(得分:16)
Option()。collect()是这种事情的好模式。
Option(myBool).collect { case true => someResult }
来自REPL:
scala> (Option(true).collect { case true => 3 }, Option(false).collect { case true => 3 })
res3: (Option[Int], Option[Int]) = (Some(3),None)
答案 2 :(得分:12)
其他答案都没有回答上述问题!要获得您指定的确切语义,请使用:
implicit class BoolToOption(val self: Boolean) extends AnyVal {
def toOption[A](value: => A): Option[A] =
if (self) Some(value) else None
}
然后你可以写
myBool.toOption(someResult)
例如:
scala> true.toOption("hi")
res5: Option[String] = Some(hi)
scala> false.toOption("hi")
res6: Option[String] = None
答案 3 :(得分:11)
从Scala 2.13
开始,Option
拥有when
构建器,用于此确切目的:
Option.when(condition)(result)
例如:
Option.when(true)(3)
// Option[Int] = Some(3)
Option.when(false)(3)
// Option[Int] = None
还请注意Option.unless
,它会促进相反的情况。
答案 4 :(得分:7)
如果您不介意someResult
被评估,无论myBool
的价值如何,您也可以使用
Some(someResult).filter(myBool)
答案 5 :(得分:4)
scala> PartialFunction.condOpt(5) { case x if true => x }
res9: Option[Int] = Some(5)
scala> PartialFunction.condOpt(5) { case x if false => x }
res10: Option[Int] = None
这里,守卫持有条件,传递给condOpt
的值是守卫评估为真时返回的值。
答案 6 :(得分:4)
另一种选择:
implicit class RichOptionCompanion(val self: Option.type) extends AnyVal {
def when[A](cond: Boolean)(value: => A): Option[A] = if(cond) Some(value) else None
}
用法:
Option.when(foo != "bar") { ... }
答案 7 :(得分:2)
class RichBool[T](a: Boolean, res:=> T) {
def toOption: Option[T] = if (a) Some(res) else None
}
implicit def boolToRichBool[T](tp: (Boolean, T)): RichBool[T] = new RichBool(tp._1, tp._2);
这会给你:
(true, 5).toOption // Some(5);
(false, 3).toOption // None
答案 8 :(得分:1)
以下是我要考虑的几件事:
val bool: Boolean = ???
val result = 1337
Option(bool).withFilter(identity).map(_ => result)
或
for {
opt <- Option(bool)
if opt
} yield result
答案 9 :(得分:0)
Option(true).find(_ == true) // Some(true)
Option(false).find(_ == true) // None