У меня есть логическое и хотели бы избежать этой схеме:
if (myBool)
Option(someResult)
else
None
Что я'd, как сделать
myBool.toOption(someResult)
Любые предложения с Пример кода будет высоко ценится.
Scalaz есть способ сделать это с BooleanOps.Вариант. Что позволит вам писать :
myBool.option(someResult)
Если вы Don'т хотите добавить Scalaz зависимостей, добавьте следующую строку в ваш код :
implicit class RichBoolean(val b: Boolean) extends AnyVal {
final def option[A](a: => A): Option[A] = if (b) Some(a) else None
}
Начиная Скала 2.13
, вариант
имеет when
Builder для этой цели:
Option.when(condition)(result)
Например:
Option.when(true)(3)
// Option[Int] = Some(3)
Option.when(false)(3)
// Option[Int] = None
Также обратите внимание Option.unless
, который способствует противоположное состояние.
Вариант().собирать () - хороший шаблон для такого рода вещей.
Option(myBool).collect { case true => someResult }
в REPL:
scala> (Option(true).collect { case true => 3 }, Option(false).collect { case true => 3 })
res3: (Option[Int], Option[Int]) = (Some(3),None)
Ни один из других ответов ответить на вопрос как заявлено! Для того чтобы получить точную семантику вы указали использовать:
implicit class BoolToOption(val self: Boolean) extends AnyVal {
def toOption[A](value: => A): Option[A] =
if (self) Some(value) else None
}
Затем вы можете написать
myBool.toOption(someResult)
например:
scala> true.toOption("hi")
res5: Option[String] = Some(hi)
scala> false.toOption("hi")
res6: Option[String] = None
Другой выбор:
implicit class RichOptionCompanion(val self: Option.type) extends AnyVal {
def when[A](cond: Boolean)(value: => A): Option[A] = if(cond) Some(value) else None
}
Использование:
Option.when(foo != "bar") { ... }
scala> PartialFunction.condOpt(5) { case x if true => x }
res9: Option[Int] = Some(5)
scala> PartialFunction.condOpt(5) { case x if false => x }
res10: Option[Int] = None
Здесь, охранник держит состояние и значение, переданное в condOpt
- это значение, возвращаемое в случае, если охранник имеет значение true.
class RichBool[T](a: Boolean, res:=> T) {
def toOption: Option[T] = if (a) Some(res) else None
}
implicit def boolToRichBool[T](tp: (Boolean, T)): RichBool[T] = new RichBool(tp._1, tp._2);
Это даст вам:
(true, 5).toOption // Some(5);
(false, 3).toOption // None
Вот несколько вещей, которые я хотел бы рассмотреть:
val bool: Boolean = ???
val result = 1337
Option(bool).withFilter(identity).map(_ => result)
или
for {
opt <- Option(bool)
if opt
} yield result