2012-09-20 17 views
9

¿Existe alguna forma mejor de escribir el código a continuación?scala mejor sintaxis para el mapa getOrElse

val t = map.get('type).getOrElse(""); 
if (t != "") "prefix" + t; 

estar interesado en código en línea algo así como

val t = map.get('type).getOrElse("").???? 

Respuesta

26

Map tiene su propio método getOrElse, por lo que sólo puede escribir lo siguiente:

val t = map.getOrElse('type, "") 

que lleva a cabo el mismo que el definición de t en su primer ejemplo.


Para hacer frente a su comentario: Si sabe que su mapa nunca contendrá la cadena vacía como un valor, puede utilizar el siguiente para añadir el "prefix":

map.get('type).map("prefix" + _).getOrElse("") 

O, si estás usando Scala 2.10:

map.get('type).fold("")("prefix" + _) 

Si su mapa puede tener "" valores, esta versión se comportará un poco differentl y que el suyo, ya que agregará el prefijo a esos valores. Si quieres exactamente el mismo comportamiento que la versión en una sola línea, puede escribir lo siguiente:

map.get('type).filter(_.nonEmpty).map("prefix" + _).getOrElse("") 

Esto probablemente no es necesario, sin embargo, parece que usted no esperar a tener cadenas vacías en tu mapa

+0

acaba de comenzar el aprendizaje de Scala, así que esto es muy útil. ¿Qué hay de la segunda línea? ¿Hay alguna forma de combinarlos? – pbaris

+1

@pbaris 'val t = map.get ('tipo) .map (k =>" prefix "+ k) .getOrElse (" ")' si te entendí bien –

+0

compilador dice "value nonEmpty no es miembro de Any ".Pero lo que @ om-nom-nom sugirió funciona como esperaba – pbaris

4

También vale la pena señalar que, en ciertos casos, puede reemplazar múltiples usos comunes .getOrElse con una llamada .withDefaultValue.

val map = complexMapCalculation().withDefaultValue("") 

val t = map('type) 

No diría que esto es algo que debe hacerse siempre, pero puede ser útil.

1

También puede utilizar la clase de tipo Scalaz Zero para que su código se vea a continuación. El operador unario se define en OptionW.

val t = ~map.get('type)     // no prefix 
val t = ~map.get('type).map("prefix"+_) // prefix 

He aquí un ejemplo de sesión:

scala> import scalaz._; import Scalaz._ 
import scalaz._ 
import Scalaz._ 

scala> val map = Map('type -> "foo") 
map: scala.collection.immutable.Map[Symbol,java.lang.String] = Map('type -> foo) 

scala> ~map.get('type) 
res3: java.lang.String = foo 

scala> ~map.get('notype) 
res4: java.lang.String = "" 

scala> ~map.get('type).map("prefix"+_) 
res5: java.lang.String = prefixfoo 

scala> ~map.get('notype).map("prefix"+_) 
res6: java.lang.String = "" 
-1

Mientras lee el libro Play for Scala, cogí este fragmento de código que se definió en un controlador, lo que podría ser una sintaxis mejor para getOrElse.

def show(ean: Long) = Action { implicit request => 

    Product.findByEan(ean).map { product => 
    Ok(views.html.products.details(product)) 
    }.getOrElse(NotFound) 

} 

En lo cual, el Product.findByEan (EAN: Long) se definió como

def findByEan(ean: Long) = products.find(_ean == ean) 
+1

Si bien esta sintaxis es agradable y útil, me temo que esta pregunta se trata de un mapa diferente; estás hablando de un recorrido de recopilación de mapas, mientras esto se trata [Colección de mapas] (http://www.scala-lang.org/api/current/index.html#scala.collection.Map). – Suma