2012-10-04 20 views
21

Questo modello comune si sente un po 'prolisso:Semplifica se (x) Alcuni (y) altro Nessuno?

if (condition) 
    Some(result) 
else None 

Stavo pensando di utilizzare una funzione per semplificare:

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

Questo riduce l'esempio in alto a:

on (condition) { result } 

fa qualcosa come questo esiste già? O è questo eccessivo?

+2

Amore StackOverflow ... imparare tanto da tutte le risposte qui sotto. – Tim

risposta

15

Scalaz include la funzione option:

import scalaz.syntax.std.boolean._ 

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

Una delle cose che mi preoccupavano della mia funzione era che non indicava chiaramente che si stava creando un'opzione. Questo è sia semplice che supera questo problema. Grazie! – Tim

18

Si potrebbe creare il primo Option e filtrare su quella con la vostra condizione:

Option(result).filter(condition) 

o se condition non è legato alla result

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

Interessante! Anche se sono un po 'preoccupato per (a) l'inatteso (per me) ordine di condizione/risultato, e (b) la tendenza a calcolare sempre il risultato, se necessario o meno. Non ci avevo pensato, comunque! Grazie! – Tim

3

È possibile utilizzare l'oggetto PartialFunction compagno e 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

Tutto ciò significava 42? "Vero"? Avrei potuto evitare di costruire la terra ... ;-) Non avevo visto 'condOpt' prima, grazie! – Tim

+0

Non è sicuramente lo scenario più utile per utilizzarlo, ma potrebbe essere utile in molti altri casi. – Nicolas

+0

Concordato! Molto bello – Tim

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

Ah, il sempre utile operatore ternario. Grazie! Ma speravo di evitare l'aggiunta ripetitiva di Some() e None. – Tim

1

Ecco un altro approccio che è molto semplice:

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

Un semplice esempio:

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 

Ecco alcuni esempi non booleane avanzate che mettono la condizione che la partita modello:

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) 
Problemi correlati