2009-01-03 24 views
24

estoy trabajando con un mapa en la Scala y haciendo el habitual "si no hay un valor asociado a una clave, cree él, lo puso en el mapa y devolverlo":idiomático Scala Mapa upsert

def alphaMemory(key : AlphaMemoryKey) = { 
    var am = map.getOrElse(key, null) 
    if(am == null) { 
     am = new AlphaMemory(key) 
     map.put(key, am) 
    } 
    am 
} 

Para mí, esto no se siente como un código Scala idiomático. Se siente como Java. ¿Hay alguna forma más concisa de escribir esto? Parecía que tal vez podría anular Map.default() para insertar el nuevo valor y devolverlo. Aunque no estoy seguro

Gracias!

Respuesta

31

mutable.Map tiene getOrElseUpdate que hace exactamente lo que quiere, no es necesario modismo idiomático.

+0

¡Excelente! No me di cuenta de que el parámetro predeterminado era "por nombre", así que me había convencido de que se evaluaría cada vez que se llamaba. ¡Gracias! –

+0

¿Me interesaría ver cómo se haría esto con los mapas inmutables? –

+0

@Marcus Downing Eche un vistazo a [esta pregunta] (http://stackoverflow.com/q/4385976/460387) para obtener soluciones para 'inmutable.Map' –