Scala - "if (true) Some (1)" без ввода "else None"

В scala, если у вас есть опция, вы можете получить другой вариант, выполнив oldOption.map(_. something). Я хочу сделать логическое и сделать то же самое. Другими словами, я хочу сокращать следующее:

if(someCondition)
  Some(data)
else
  None

Есть ли идиоматический способ получить опцию из булева, как это, без необходимости делать "else None"?

Ответ 1

Scalaз имеет это. Код будет выглядеть так:

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

Тип opt будет Option[String]

Ответ 2

Если вы не возражаете создавать данные каждый раз,

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 }

Ответ 3

Как играть с огнем:

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

Использование:

data someIf someCondition

Недостатки:

  • Опасное, неявное преобразование из Any
  • Вычисляет данные каждый раз

Ответ 4

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

Лично я использую этот шаблон много, когда мне нужно извлечь что-то, например.

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