En este post voy a explicarte como se escriben los ciclos for en Scala y te mostraré algunas variantes.
Primeros pasos.
El ciclo for es una estructura de control que permite repetir acciones, este es parte del paradigma de programación estructurado y existe prácticamente en todos los lenguajes. Esta estructura se ejecutará N veces de acuerdo a las condicionales introducidas.
En Scala, el ciclo for recorre una colección, no realiza incrementos o decrementos, ni tampoco revisa las condicionales. Se parece más a la estructura de control foreach, que a la estructura de control for de los lenguajes de sintaxis C.
//iterating a list | |
var list = List(1, -2, 3) | |
for(item <- list) println(item) | |
//iterating a range declared outside | |
var decimalRange = BigDecimal(0.0) to BigDecimal(1.0) by .01 | |
for(item <- decimalRange) println(item) | |
//iterating a range declared inside | |
for(item <- 0 to 10 by 2) println(item) |
Filtros.
Puedes especificar filtros en tu ciclo for. Después de especificar la colección, agregas «;» con una sentencia if. Solo se iterará sobre los elementos que cumplan las condiciones.
var sequence = 1 to 30 | |
sequence.foreach(println) | |
def isDivisibleBy3(input:Int) = { input % 3 == 0 } | |
def isDivisibleBy5(input:Int) = {input % 5 == 0 } | |
for(item <- sequence; if isDivisibleBy5(item) ; if isDivisibleBy3(item)) { | |
println(item) | |
} |
Yield.
Por defecto, la instrucción for no retorna ningún valor. Bueno, si lo hace, pero es un valor de tipo Any. Si requieres que la estructura de control retorne una colección, tendrás que especificarlo con la palabra reservada yield. La estructura del ciclo for también cambiará un poco.
var sequence = 1 to 30 | |
sequence.foreach(println) | |
def isDivisibleBy3(input:Int) = { input % 3 == 0 } | |
// for without yield | |
for(item <- sequence; if isDivisibleBy3(item)) { | |
println(item) | |
} | |
//for with yield | |
var forResult = for{ item <- sequence if isDivisibleBy3(item) } yield item | |
forResult.foreach(println) |
For vs foreach.
For y foreach no juegan en la misma liga. El primero es una estructura de control y el segundo únicamente es un método auxiliar de las colecciones. For puede realizar ciertas optimizaciones en las iteraciones y foreach nada más crea una función anónima adicional; foreach no retorna ningún valor, for si puede hacerlo con yield.
var sequence = 1 to 30 | |
sequence.foreach(println) | |
def isDivisibleBy3(input:Int) = { input % 3 == 0 } | |
//for with yield is a variable | |
var forResult = for{ item <- sequence if isDivisibleBy3(item) } yield item | |
// forResult is a Vector, a collection | |
println(forResult) | |
// foreachResult is Unit, not a collection | |
var foreachResult:Unit = forResult.foreach(println) | |
println(foreachResult) |
- NVL in SQL Server - 2023-11-01
- ¿Que es Cake Build? - 2023-02-22
- #How to fix error: MSB4019: The imported project «Microsoft.Data.Tools.Schema.SqlTasks.targets» was not found - 2023-02-20