Ответ 1
Scalaз имеет это. Код будет выглядеть так:
import scalaz._
import Scalaz._
val b = true
val opt = b option "foo"
Тип opt
будет Option[String]
В scala, если у вас есть опция, вы можете получить другой вариант, выполнив oldOption.map(_. something). Я хочу сделать логическое и сделать то же самое. Другими словами, я хочу сокращать следующее:
if(someCondition)
Some(data)
else
None
Есть ли идиоматический способ получить опцию из булева, как это, без необходимости делать "else None"?
Scalaз имеет это. Код будет выглядеть так:
import scalaz._
import Scalaz._
val b = true
val opt = b option "foo"
Тип opt
будет Option[String]
Если вы не возражаете создавать данные каждый раз,
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 }
Как играть с огнем:
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
}