在scala中,如果你有一个Option,你可以通过执行oldOption.map(_.something(来获得另一个Option。换句话说,我想要以下内容的简写:
if(someCondition)
Some(data)
else
None
有没有一种惯用的方法可以从这样的布尔值中获得Option,而不必执行"else-None"?
如果您不介意每次都创建数据,
Some(data).filter(someCondition)
会成功的。如果你介意每次都创建数据,
Option(someCondition).filter(_ == true).map(_ => data)
但我认为这一点再清楚不过了。如果我是你的话,我愿意和你一起去。
或者你可以
def onlyIf[A](p: Boolean)(a: => A) = if (p) Some(a) else None
然后
onlyIf(someCondition){ data }
Scalaz有这个。代码如下所示:
import scalaz._
import Scalaz._
val b = true
val opt = b option "foo"
opt
的类型将是Option[String]
玩火吧:
implicit class CondOpt[T](x: => T) {
def someIf(cond: Boolean) = if (cond) Some(x) else None
}
用途:
data someIf someCondition
缺点:
Any
的危险隐性转换
import PartialFunction._
condOpt(someCondition) {
case true => data
}
就我个人而言,当我需要提取一些东西时,我经常使用这种模式,例如
val maybeInt: Option[Int] = condOpt(string) {
case AsInt(i) if i > 0 => i
}
https://github.com/scala/scala/commit/44d08f68eb88c83a803eda240b6fdb18450aa8af
在Scala 2.13中,您可以使用Option.when()
Option.when(true)(data)
或者你可以使用与之相反的Option.unless()
Option.unless(false)(data)