sábado, 25 de febrero de 2017

Un resumen de Scala for the Impatient, parte 10


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)