viernes, 30 de diciembre de 2016

Un resumen de Scala for the Impatient, parte 5

Uso avanzado de loops y loops por comprensión 

Me costo mucho buscar la traducción de “for Comprehensions” por lo tanto decidí poner “por comprensión”. Si le parece mal me avisan y lo cambio.

Como vimos el operador for es mucho más rico en scala que en java o C.

Se puede tener múltiples generadores de la forma variable <- expresión separados por ;

 for (i <- 1 to 3; j <- 1 to 3) print((10 * i + j) + " ")
// Prints 11 12 13 21 22 23 31 32 33

cada generador puede tener su condición:

for (i <- 1 to 3; j <- 1 to 3 if i != j) print((10 * i + j) + " ")
// Prints 12 13 21 23 31 32

También se puede usar n cantidad de variables:

for (i <- 1 to 3; from = 4 - i; j <- from to 3) print((10 * i + j) + " ")
// Prints 13 22 23 31 32 33

Con la palabra yield se puede retornar una colección que este formada por el resultado de cada iteración:

for (i <- 1 to 10) yield i % 3
// Yields Vector(1, 2, 0, 1, 2, 0, 1, 2, 0, 1)

Este tipo de loops se denominan “por compresión”. De esta forma podemos generar diferentes colecciones:

for (c <- "Hello"; i <- 0 to 1) yield (c + i).toChar
// Yields "Hieflmlmop"

for (i <- 0 to 1; c <- "Hello") yield (c + i).toChar
// Yields Vector('H', 'e', 'l', 'l', 'o', 'I', 'f', 'm', 'm', 'p')

En el ejemplo podemos ver que la lista generada es compatible con la primer variable que se itera.