Modificar Map
Para poder modificar datos de un map debemos utilizar un mapa mutable. Y lo podemos hacer de la siguiente manera:
scores("Bob") = 10
// Actualiza el valor de la key “Bob” asumiendo que esta existe.
scores("Fred") = 7
//Agrega una nueva key y valor (asumiendo que es un map mutable)
Alternativamente podemos utilizar el operador += para modificar y agregar valores de forma masiva:
scores += ("Bob" -> 10, "Fred" -> 7)
Podemos remover una key con el operador -=
scores -= "Alice"
No se puede modificar mapas inmutables (de hay lo de inmutable) pero podemos crear nuevos mapas con diferentes valores:
val newScores = scores + ("Bob" -> 10, "Fred" -> 7) // Nuevo mapa con valores modificados
Ahora obtenemos un nuevo mapa llamado newScore con el valor de “Bob” modificado y “Fred” agregado.
De la misma manera podemos utilizar este operador para un mapa mutable:
var scores = ...
scores = scores + ("Bob" -> 10, "Fred" -> 7)
De igual forma podemos remover valores con el - :
scores = scores – "Alice"
Se podría pensar que es ineficiente construir nuevos mapas por operador, pero esto no es así. Dado que los mapas antiguos y nuevos comparten la mayor parte de su estructura. (Esto es posible porque son inmutables.)
Iterando sobre los mapas
Iterar sobre todos los pares clave / valor de un mapa es fácil, podemos utilizar el bucle for:
for ((k, v) <- map) process k and v
La magia aquí esta en el uso de pattern matching usado en el bloque for. Luego vamos a hablar de pattern matching, no se preocupen. De este modo obtenemos la clave y el valor en cada iteración.
Si necesitamos solamente iterar por Key, podemos utilizar el método KeySet de java o values para iterar por valor:
scores.keySet // retorna un set con las claves: Set("Bob", "Cindy", "Fred", "Alice")
for (v <- scores.values) println(v) // Imprime los valores.
Por supuesto podemos utilizar esta técnicas con lo antes aprendido, si por ejemplo deseamos retornar un mapa donde su valor sea la clave del anterior:
for ((k, v) <- map) yield (v, k)