2009-01-03 7 views
24

Ich arbeite mit einer Karte in der Scala und dabei die üblichen „wenn kein Wert mit einem Schlüssel zugeordnet ist, erstellen Sie es, es in der Karte setzen und sie zurückbringen“:Idiomatic Scala Karte Upsert

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

Das fühlt sich für mich nicht wie idiomatischer Scala-Code an. Es fühlt sich an wie Java. Gibt es eine prägnantere Art, dies zu schreiben? Es sah so aus, als könnte ich Map.default() überschreiben, um den neuen Wert einzufügen und zurückzugeben. Nicht sicher, obwohl.

Danke!

Antwort

31

mutable.Map hat getOrElseUpdate was genau das tut, was Sie wollen, kein Idiom notwendig.

+0

Ausgezeichnet! Ich wusste nicht, dass der Standardparameter "By-Name" war, also hatte ich mich davon überzeugt, dass es jedes Mal ausgewertet werden würde, wenn es aufgerufen wurde. Vielen Dank! –

+0

Ich wäre interessiert zu sehen, wie dies mit unveränderlichen Karten gemacht würde? –

+0

@Marcus Downing Werfen Sie einen Blick auf [diese Frage] (http://stackoverflow.com/q/4385976/460387) für Lösungen für 'immutable.Map' –