2012-10-04 13 views
21

Este patrón común se siente un poco prolijo:Simplifique si (x) Algo (y) else ¿Ninguna?

if (condition) 
    Some(result) 
else None 

Yo estaba pensando en usar una función para simplificar:

def on[A](cond: Boolean)(f: => A) = if (cond) Some(f) else None 

Esto reduce el ejemplo de arriba a:

on (condition) { result } 

hace algo como esto ya existe? ¿O es esto exagerado?

+2

Amor StackOverflow ... aprender mucho de todas las respuestas a continuación. – Tim

Respuesta

15

Scalaz incluye la función option:

import scalaz.syntax.std.boolean._ 

true.option("foo") // Some("foo") 
false.option("bar") // None 
+0

Una de las cosas que me preocupaba acerca de mi función era que no indicaba claramente que se estaba creando una opción. Esto es simple y supera ese problema. ¡Gracias! – Tim

18

Se puede crear la primera Option y filtrar en que con su condición:

Option(result).filter(condition) 

o si condition no está relacionado con result

Option(result).filter(_ => condition) 
+4

¡Interesante! Aunque estoy un poco preocupado por (a) el orden inesperado (de mi parte) de la condición/resultado, y (b) la tendencia a calcular siempre el "resultado", sea necesario o no. ¡Aunque no había pensado en eso! ¡Gracias! – Tim

3

Usted puede utilizar el objeto PartialFunction compañero y condOpt:

PartialFunction.condOpt(condition) {case true => result} 

Uso:

scala> PartialFunction.condOpt(false) {case true => 42} 
res0: Option[Int] = None 

scala> PartialFunction.condOpt(true) {case true => 42} 
res1: Option[Int] = Some(42) 
+0

¿Eso es todo 42? "Cierto"? Podría haber evitado construir la tierra ... ;-) No había visto 'condOpt' antes, ¡gracias! – Tim

+0

Definitivamente no es el escenario más útil para usarlo, pero puede ayudar en muchos otros casos. – Nicolas

+0

de acuerdo! Muy genial. – Tim

1
import scalaz._, Scalaz._ 
val r = (1 == 2) ? Some(f) | None 
System.out.println("Res = " + r) 
+0

Ah, el operador ternario siempre útil. ¡Gracias! Pero esperaba evitar la adición repetitiva de Some() y None. – Tim

1

Aquí hay otro enfoque que es bastante sencillo:

Option(condition).collect{ case true => result } 

Un ejemplo sencillo:

scala> val enable = true 
enable: Boolean = true 

scala> Option(enable).collect{case true => "Yeah"} 
res0: Option[String] = Some(Yeah) 

scala> Option(!enable).collect{case true => "Yeah"} 
res1: Option[String] = None 

Aquí algunos ejemplos no booleanas avanzados que ponen a la condición en la coincidencia de patrón:

val param = "beta" 
Option(param).collect{case "alpha" => "first"} // gives None 

Option(param).collect{case "alpha" => "first" 
         case "beta" => "second" 
         case "gamma" => "third"} // gives Some(second) 

val number = 999 
Option(number).collect{case 0 => "zero" 
         case x if x > 10 => "too high"} // gives Some(too high)