Scala: Boolean to Option

J’ai un booléen et je voudrais éviter ce modèle:

if (myBool) Option(someResult) else None 

Ce que je voudrais faire c’est

 myBool.toOption(someResult) 

Toute suggestion avec un exemple de code serait très appréciée.

Scalaz a un moyen de le faire avec BooleanOps.option . Cela vous permettrait d’écrire:

 myBool.option(someResult) 

Si vous ne souhaitez pas append une dépendance Scalaz, ajoutez simplement ce qui suit dans votre code:

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

Option (). Collect () est un bon modèle pour ce genre de chose.

 Option(myBool).collect { case true => someResult } 

du REPL:

 scala> (Option(true).collect { case true => 3 }, Option(false).collect { case true => 3 }) res3: (Option[Int], Option[Int]) = (Some(3),None) 

Aucune des autres réponses ne répond à la question comme indiqué! Pour obtenir la sémantique exacte que vous avez spécifiée, utilisez:

 implicit class BoolToOption(val self: Boolean) extends AnyVal { def toOption[A](value: => A): Option[A] = if (self) Some(value) else None } 

Vous pouvez alors écrire

 myBool.toOption(someResult) 

par exemple:

 scala> true.toOption("hi") res5: Option[Ssortingng] = Some(hi) scala> false.toOption("hi") res6: Option[Ssortingng] = None 

Si vous ne voulez pas que someResult soit évalué, peu importe la valeur de myBool vous pouvez également l’utiliser

 Some(someResult).filter(myBool) 
 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 

Ici, le garde contient la condition et la valeur transmise à condOpt est la valeur renvoyée si la protection est évaluée à true.

Un autre choix:

 implicit class RichOptionCompanion(val self: Option.type) extends AnyVal { def when[A](cond: Boolean)(value: => A): Option[A] = if(cond) Some(value) else None } 

Usage:

 Option.when(foo != "bar") { ... } 
 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); 

Cela vous donnerait:

 (true, 5).toOption // Some(5); (false, 3).toOption // None