Scala - “if(true)Some(1)”而不必输入“else None”

时间:2013-05-01 21:46:48

标签: scala

在scala中,如果你有一个Option,你可以通过执行oldOption.map(_。something)来获得另一个Option。我想要做的是采用布尔值并做同样的事情。换句话说,我想要速记以下内容:

if(someCondition)
  Some(data)
else
  None

是否有一种惯用的方法可以从这样的布尔中获取选项而不必执行“其他无”?

6 个答案:

答案 0 :(得分:17)

如果您不介意每次都创建数据,

Some(data).filter(someCondition)

会做到这一点。如果您每次都介意创建数据,

Option(someCondition).filter(_ == true).map(_ => data)

但我不认为这更清楚。如果我是你,我会和if一起去。

或者你可以

def onlyIf[A](p: Boolean)(a: => A) = if (p) Some(a) else None

然后

onlyIf(someCondition){ data }

答案 1 :(得分:12)

Scalaz有这个。代码如下所示:

import scalaz._
import Scalaz._
val b = true  
val opt = b option "foo"

opt的类型为Option[String]

答案 2 :(得分:3)

如何玩火:

implicit class CondOpt[T](x: => T) {
  def someIf(cond: Boolean) = if (cond) Some(x) else None
}

使用:

data someIf someCondition

缺点:

  1. Any
  2. 的危险,隐含转换
  3. 每次计算数据

答案 3 :(得分:2)

import PartialFunction._
condOpt(someCondition) {
  case true => data
}

当我需要提取某些内容时,我个人会使用这种模式,例如

val maybeInt: Option[Int] = condOpt(string) {
  case AsInt(i) if i > 0 => i
}

答案 4 :(得分:0)

Scala 2.13具有Option.when(someCondition)(dataExpression)及其推论Option.unless

https://github.com/scala/scala/commit/44d08f68eb88c83a803eda240b6fdb18450aa8af

答案 5 :(得分:0)

在Scala 2.13中,您可以使用Option.when()

Option.when(true)(data)

或者您可以使用相反的字词,即Option.unless()

Option.unless(false)(data)