31

这种常见的模式感觉有点冗长:

if (condition) 
  Some(result)
else None

我正在考虑使用一个函数来简化:

def on[A](cond: Boolean)(f: => A) = if (cond) Some(f) else None

这将顶部示例简化为:

on (condition) { result }

这样的东西已经存在了吗?或者这是矫枉过正?

4

7 回答 7

27

您可以创建第Option一个并根据您的条件对其进行过滤:

Option(result).filter(condition)

或者如果condition不相关result

Option(result).filter(_ => condition)
于 2012-10-04T13:51:43.473 回答
18

Scalaz包含选项功能:

import scalaz.syntax.std.boolean._

true.option("foo") // Some("foo")
false.option("bar") // None
于 2012-10-04T13:56:32.000 回答
18

开始Scala 2.13,Option现在由执行此操作的when构建器提供:

Option.when(condition)(result)

例如:

Option.when(true)(45)
// Option[Int] = Some(45)
Option.when(false)(45)
// Option[Int] = None

还要注意相反的耦合unless方法。

于 2018-10-10T19:21:58.190 回答
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)
于 2012-10-04T13:55:38.630 回答
2
import scalaz._, Scalaz._
val r = (1 == 2) ? Some(f) | None
System.out.println("Res = " + r)
于 2012-10-04T13:57:38.320 回答
2

这是另一种非常简单的方法:

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)
于 2017-08-25T18:44:16.543 回答
1

与 Scalaz 类似,Typelevel 猫生态系统具有以下鼠标option

scala> true.option("Its true!")
res0: Option[String] = Some(Its true!)
于 2019-11-01T02:11:11.693 回答