2012-10-04 17 views
6

Básicamente quiero extraer un montón de opciones a, b, etc. ¿Es esta la mejor manera de hacer esto en Scala? Me parece algo confuso tener el for-yield entre paréntesis.¿Es for-yield-getOrElse Scala paradigmático o hay una manera mejor?

(for { 
    a <- a 
    b <- b 
    c <- c 
    ... 
} yield { 
    ... 
}) getOrElse { 
    ... 
} 
+2

Parece que no obtendrás mejores resultados con * core * scala, pero posiblemente puedas [dar una oportunidad para scalaz] (http://www.casualmiracles.com/2012/01/16/a-small -example-de-aplicativo-funtores-con-scalaz /)? –

+0

El ejemplo de Scalaz realmente no trata con este escenario sino con 3 opciones independientes; aquí la pregunta es sobre Opciones anidadas; ¿Me estoy perdiendo de algo? –

+0

No creo que haya nada de malo en una comprensión forzada envuelta en parens, es una expresión como cualquier otra. Lo hago todo el tiempo. –

Respuesta

6

Trate de usar map y flatMap lugar. Suponga que tiene la siguiente jerarquía de clases:

case class C(x: Int) 
case class B(c: Option[C]) 
case class A(b: Option[B]) 

val a = Some(A(Some(B(Some(C(42)))))) 

Con el fin de extraer 42 se puede decir:

a.flatMap(_.b).flatMap(_.c).map(_.x).getOrElse(-1) 

Esto es aproximadamente equivalente a:

for(
    a <- a 
    b <- a.b 
    c <- b.c) 
     yield c.x 

excepto que devuelve Some(42). De hecho, la comprensión de for se traduce en realidad en una secuencia de llamadas map/flatMap.

+0

entonces, ¿habrá una cadena de mapas planos/mapas? (Garret escribió '...' así que supongo que habrá más de dos opciones) –

+0

¿Qué tal para c, d, etc.? ¿Y cuál es paradigmático, si existe tal cosa en Scala? –

+0

@ om-nom-nom: reformulé mi ejemplo para indicar claramente cómo se implementa el encadenamiento. –

Cuestiones relacionadas