fun main () {
var i = 0;
val a = IntArray(10);
for (j in 0..9) a[j] = 10 + j;
while (i < 10) {
("$i -> ${a[i]}");
println ++;
i}
("--------------------------------");
println do {
--;
i("$i -> ${a[i]}");
print if (i > 4) {
();
println continue;
}
("**");
println if (i == 1) break;
} while (i > 0);
for (j in a) print ("$j ");
();
printlnfor (j in a.indices) { print ("${a[j]} ");}
();
printlnfor ((j,v) in a.withIndex()) { print ("$j -> $v ");}
();
printlnfor (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.
indices
nos permite iterar a través del array de la forma tradicional utilizando los índices del array.withIndex
nos 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) {
(letra)
println }
También podemos usar for
para iterar Map
s 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) {
("$clave - $valor");
println }
for ( clave in map.keys) {
(clave);
println }
for ( valor in map.values) {
(valor);
println }
SABÍAS QUE?
Kotlin ofrece una función
forEach
como alternativa a los buclesfor
pero con un aire de programación funcional..forEach { numero -> numeros(numero) println }
O si queremos recuperar también el índice:
.forEachIndexed {indice, valor -> numeros("$indice : $valor") println }
Si, lo que sigue al
forEach
es una expresión lambda y es por ello que son más lentos que los buclesfor
normal, 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
,while
ydo .. while
- Kotlin ofrece las palabras clave
continue
ybreak
para controlar el progreso del bucle - Kotlin ofrece un interfaz funcional para construir bucles utilizando
las funciones
forEach
yforEachIndexed
- Los bucles
for
en Kotlin se pueden utilizar para recorrer cualquier estructura de datositerable
, como arrays, tablas hash o cadenas.
■