2013-06-18 4 views
9

In meinem Scala-Programm erhalte ich etwas JSON.Idiomatische Art der Behandlung Option [Boolean]

Eines der Felder ist ein optionaler Boolescher Wert. Wenn das Feld fehlt oder sein Wert falsch ist, möchte ich None zurückgeben. Wenn sein Wert wahr ist, möchte ich Some(true) zurückgeben.

Da dies entspricht Some(false) in None zu konvertieren, habe ich die folgende Funktion definiert:

def boolmap(ob: Option[Boolean]) = if(ob == Some(false)) None else ob

Es funktioniert, aber es scheint nicht sehr idiomatisch zu sein. Gibt es etwas Eleganteres?

+6

Seit Sie reduzieren eine triadische Bedingung auf eine duale Bedingung, IMO idiomatisch wäre es, einen einfachen booleschen Wert ('getOrElse (false)') zu erzeugen und die Option ' –

+0

@ 0__ fallen zu lassen. Die Sache ist, die Option ist ziemlich praktisch für einige Verarbeitungen muss später tun. – Eduardo

+0

Können Sie 'ob.isDefined' nicht verwenden, um den zugrunde liegenden booleschen Wert zu erhalten? –

Antwort

19

Dies ist ob.filter(identity). Ich bin mir nicht sicher, ob das klarer ist, aber es ist kürzer.

+1

Danke! Ich habe auch gefunden 'für (x <- ob wenn x) Ausbeute x ' – Eduardo

+0

@ Eduardo - In der Tat. Es gibt auch "ob.filterNot (! _)", "Ob.find (Identität)", "ob.collect {case true => true}" und verschiedene andere. Sie können auch 'x => x' anstelle von' identity' schreiben. –

6

ich mit anderen einverstanden, dass Sie vielleicht auch nur true oder false zurückkehren, da Sie nicht zwischen dem Attribute nicht differenzieren es überhaupt zu sein, wobei null oder false zu sein.

Wenn Sie nur Boolean zurück Sie es auf diese Weise tun könnte:

scala> Some(true) exists { _ == true } 
res0: true 

scala> Some(false) exists { _ == true } 
res1: Boolean = false 

scala> None exists { _ == true } 
res2: Boolean = false 

Wenn Sie darauf bestehen Option[Boolean] bei der Rückkehr ein Muster Spiel wäre mehr idiomatische:

ob match { 
    case Some(true) => Some(true) 
    case _   => None 
} 

Sie auch collect verwenden könnte aber in diesem Fall würde es IMO seltsam aussehen:

+2

Anstelle von 'exists {_ == true}' ist es sinnvoller, 'exists (identity)' oder 'contains (true)' zu schreiben. Das Vergleichen von bool mit true wird von vielen Programmierern verpönt [Ist es schlecht, explizit mit booleschen Konstanten zu vergleichen, z. if (b == false) in Java] (http://stackoverflow.com/questions/2661110/is-it-bad-to-explicitly-compare-against-boolean-constants-eg-if-b-false-i). – Suma

Verwandte Themen