这种常见的模式感觉有点冗长:
if (condition)
Some(result)
else None
我正在考虑使用函数来简化:
def on[A](cond: Boolean)(f: => A) = if (cond) Some(f) else None
这将顶部示例缩小为:
on (condition) { result }
这样的事情是否存在?或者这有点过头了吗?
答案 0 :(得分:23)
您可以先创建Option
并根据您的条件对其进行过滤:
Option(result).filter(condition)
或condition
与result
Option(result).filter(_ => condition)
答案 1 :(得分:17)
import scalaz.syntax.std.boolean._
true.option("foo") // Some("foo")
false.option("bar") // None
答案 2 :(得分:5)
when
构建器现在提供了从Scala 2.13
开始的Option
,
Option.when(condition)(result)
例如:
Option.when(true)(45)
// Option[Int] = Some(45)
Option.when(false)(45)
// Option[Int] = None
还要注意,耦合unless
方法却相反。
答案 3 :(得分:4)
您可以使用PartialFunction
随播广告对象和condOpt
:
PartialFunction.condOpt(condition) {case true => result}
用法:
scala> PartialFunction.condOpt(false) {case true => 42}
res0: Option[Int] = None
scala> PartialFunction.condOpt(true) {case true => 42}
res1: Option[Int] = Some(42)
答案 4 :(得分:1)
import scalaz._, Scalaz._
val r = (1 == 2) ? Some(f) | None
System.out.println("Res = " + r)
答案 5 :(得分:1)
这是另一种非常简单的方法:
Option(condition).collect{ case true => result }
一个简单的例子:
scala> val enable = true
enable: Boolean = true
scala> Option(enable).collect{case true => "Yeah"}
res0: Option[String] = Some(Yeah)
scala> Option(!enable).collect{case true => "Yeah"}
res1: Option[String] = None
这里有一些高级非布尔示例将条件置于模式匹配中:
val param = "beta"
Option(param).collect{case "alpha" => "first"} // gives None
Option(param).collect{case "alpha" => "first"
case "beta" => "second"
case "gamma" => "third"} // gives Some(second)
val number = 999
Option(number).collect{case 0 => "zero"
case x if x > 10 => "too high"} // gives Some(too high)
答案 6 :(得分:1)
类似于Scalaz,Typelevel猫生态系统具有mouse package和option
:
scala> true.option("Its true!")
res0: Option[String] = Some(Its true!)