fun main () {
var i = 0;
val a = IntArray(10);
for (j in 0..9) a[j] = 10 + j;
while (i < 10) {
println ("$i -> ${a[i]}");
i++;
}
println ("--------------------------------");
do {
i--;
print ("$i -> ${a[i]}");
if (i > 4) {
println ();
continue;
}
println ("**");
if (i == 1) break;
} while (i > 0);
for (j in a) print ("$j ");
println();
for (j in a.indices) { print ("${a[j]} ");}
println();
for ((j,v) in a.withIndex()) { print ("$j -> $v ");}
println();
for (j in 9 downTo 0 step 2) print ("${a[j]} ");
println ();
}Kotlin nos ofrece bucles while, do .. while
y for sobre objetos con iteradores al estilo
foreach de otros lenguajes. El lenguaje ofrece varias
posibilidades para generar rangos y así crear bucles clásicos. El
programa muestra algunos ejemplos; .., downTo
o step. until es otra función infija que nos
permite generar rangos para nuestros bucles.
SABIAS QUE
Kotlin permite definir funciones denominadas
infix. Estas funciones se pueden ejecutar en formato infijo o como métodos. Las dos expresiones que veremos a continuación son equivalentes:for (j in 0 until 10 step 1) println ("$j"); for (j in 0.until(10).step(1)) println ("$j");
Además de esto, Kotlin ofrece las instrucción break y
continue que nos permiten terminar prematuramente el bucle
o continuar con la siguiente iteración como es habitual en la mayoría de
lenguajes.
Cuando se trata de iterar los elementos de un array, la clase Array y derivadas ofrecen métodos para generar los rangos que necesitamos.
Al final del programa podéis encontrar algunos de los ejemplos más comunes.
indicesnos permite iterar a través del array de la forma tradicional utilizando los índices del array.withIndexnos permite obtener un par o tupla conteniendo el índice y su valor en un solo paso.
Podemos utilizar bucles for como los que hemos visto
antes para iterar a través de cadenas de caracteres:
val cadena="Occam's Razor"
for (letra in cadena) {
println (letra)
}También podemos usar for para iterar Maps o
tablas hash si lo preferís. En este caso obtenemos de una sola vez el
par clave valor para cada elemento a no ser que utilicemos
keys o values
val map = mapOf (
"uno" to 1,
"dos" to 2,
"tres" to 3,
)
for ((clave, valor) in map) {
println ("$clave - $valor");
}
for ( clave in map.keys) {
println (clave);
}
for ( valor in map.values) {
println (valor);
}SABÍAS QUE?
Kotlin ofrece una función
forEachcomo alternativa a los buclesforpero con un aire de programación funcional.numeros.forEach { numero -> println (numero) }O si queremos recuperar también el índice:
numeros.forEachIndexed {indice, valor -> println ("$indice : $valor") }Si, lo que sigue al
forEaches una expresión lambda y es por ello que son más lentos que los buclesfornormal, si bien, en ocasiones hacen que el código sea más legible.
Podemos generar bucles infinitos fácilmente con
while:
while (true) {
// Repite para Siempre
}
do {
// Repite para siempre
} while (true)Conseguir el mismo resultado con for es más complicado,
puesto que for esta pensado para funcionar exclusivamente
sobre iterables. El siguiente código generaría un bucle
infinito con for:
for (i in generateSequence(0) { it }) {
// Repite para siempre
}Resumen
- Kotlin ofrece bucles
for,whileydo .. while - Kotlin ofrece las palabras clave
continueybreakpara controlar el progreso del bucle - Kotlin ofrece un interfaz funcional para construir bucles utilizando
las funciones
forEachyforEachIndexed - Los bucles
foren Kotlin se pueden utilizar para recorrer cualquier estructura de datositerable, como arrays, tablas hash o cadenas.
■
