Подтвердить что ты не робот

Scala: логический параметр

У меня есть Boolean и хотелось бы избежать этого шаблона:

if (myBool) 
  Option(someResult) 
else 
  None

Что я хотел бы сделать, это

myBool.toOption(someResult)

Приветствуются любые предложения с примером кода.

4b9b3361

Ответ 1

У Scalaz есть способ сделать это с помощью BooleanOps.option. Это позволит вам написать:

myBool.option(someResult)

Если вы не хотите добавлять зависимость Scalaz, просто добавьте в свой код следующее:

implicit class RichBoolean(val b: Boolean) extends AnyVal {
  final def option[A](a: => A): Option[A] = if (b) Some(a) else None
}

Ответ 2

Option(). collect() - хороший шаблон для такого рода вещей.

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)

Ответ 3

Ни один из других ответов не отвечает на вопрос, как указано! Чтобы получить точную семантику, которую вы указали, используйте:

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

Ответ 4

Если вы не возражаете, что someResult оценивается независимо от значения myBool, вы также можете использовать

Some(someResult).filter(myBool)

Ответ 5

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, - это значение, возвращаемое, если защита оценивается как истина.

Ответ 6

Другой выбор:

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") { ... }

Ответ 7

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

Ответ 8

Вот пара вещей, которые я хотел бы рассмотреть:

val bool: Boolean = ???
val result = 1337    

Option(bool).withFilter(identity).map(_ => result)

или же

for {
  opt <- Option(bool)
  if opt
} yield result

Ответ 9

Начиная с Scala 2.13, Option имеет конструктор A):Option[A] rel="nofollow noreferrer"> when для этой конкретной цели:

Option.when(condition)(result)

Например:

Option.when(true)(3)
// Option[Int] = Some(3)
Option.when(false)(3)
// Option[Int] = None

Также обратите внимание на A):Option[A] rel="nofollow noreferrer"> Option.unless который способствует противоположному условию.