Scala:布尔到选项
我有一个布尔值,并希望避免这种模式:
if (myBool) Option(someResult) else None
我想要做的是
myBool.toOption(someResult)
任何build议与代码示例将不胜感激。
斯卡拉斯有一个方法来做到这一点与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 }
选项()。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)
其他答案都没有回答这个问题! 要获得您指定的确切语义,请使用:
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
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
的值是当守卫评价为真时返回的值。
如果你不介意someResult
被评估,不pipemyBool
的值你也可以使用
Some(someResult).filter(myBool)
另一个select:
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") { ... }
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