12

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

if(someCondition)
  Some(data)
else
  None

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

4

6 回答 6

18

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

Some(data).filter(someCondition)

会成功的。如果您介意每次都创建数据,

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

但我不认为这更清楚。如果我是你,我会选择 if-else。

或者你可以

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

进而

onlyIf(someCondition){ data }
于 2013-05-01T21:58:54.533 回答
13

斯卡拉兹有这个。代码如下所示:

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

的类型opt将是Option[String]

于 2013-05-01T23:13:24.270 回答
3

玩火怎么样:

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

采用:

data someIf someCondition

缺点:

  1. 危险的隐式转换Any
  2. 每次计算数据
于 2013-05-01T22:31:28.740 回答
2
import PartialFunction._
condOpt(someCondition) {
  case true => data
}

就我个人而言,当我需要提取某些东西时,我经常使用这种模式,例如

val maybeInt: Option[Int] = condOpt(string) {
  case AsInt(i) if i > 0 => i
}
于 2013-05-23T14:04:32.533 回答
1

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

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

于 2019-05-29T17:25:53.767 回答
1

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

Option.when(true)(data)

或者你可以使用它的反义词,即Option.unless()

Option.unless(false)(data)
于 2020-05-04T02:21:46.470 回答