Cuando trabajas con colecciones grandes en Kotlin, recorrer cada elemento manualmente deja de ser viable. Los ciclos en Kotlin (for, while y do-while) te permiten iterar miles de elementos con pocas líneas, automatizar tareas repetitivas y validar datos sobre la marcha. Aquí verás cómo funcionan, cuándo usar cada uno y un ejercicio práctico para fijar la lógica.
¿Qué es un loop y por qué lo necesitas en Kotlin?
Un loop es una instrucción que repite un bloque de código mientras una condición sea verdadera. Imagina que automatizas el envío de correos: en lugar de escribir tres veces la misma instrucción, declaras una variable emailsPendientes y dejas que el ciclo haga el trabajo hasta que el contador llegue a cero.
¿Para qué sirven los ciclos en programación? Para repetir instrucciones sin duplicar código. Son la base para recorrer arrays, validar entradas, procesar lotes y cualquier tarea que dependa de una condición.
¿Cómo funciona el ciclo while en Kotlin?
El while evalúa una condición antes de ejecutar el bloque. Si la expresión es verdadera, repite; si es falsa, sale del ciclo.
kotlin
var emailsPendientes = 3
while (emailsPendientes > 0) {
println("Procesando email. Quedan $emailsPendientes")
emailsPendientes -= 1
}
El detalle clave: si nunca modificas la variable de la condición, el ciclo se vuelve infinito. Por eso decrementas emailsPendientes con -= 1 en cada vuelta. Cuando la variable llega a cero, la condición emailsPendientes > 0 se evalúa como falsa y el programa sigue su curso.
¿Y si la condición es falsa desde el inicio?
El bloque no se ejecuta ni una vez. Si arrancas con emailsPendientes = 0, el while se salta por completo. Aquí aparece la diferencia con su primo cercano: el do-while.
¿Cuál es la diferencia entre while y do-while?
El do-while ejecuta el bloque al menos una vez y luego evalúa la condición. Es ideal para reintentos, como volver a enviar un correo fallido.
kotlin
var intentos = 0
do {
intentos += 1
println("Intento de envío número $intentos")
} while (intentos < 3)
¿Cuándo uso do-while en lugar de while? Cuando necesitas que el código se ejecute al menos una vez antes de validar la condición, como pedir input al usuario o reintentar una operación.
¿Cómo recorrer rangos y arrays con el ciclo for?
El for es el ciclo más usado para recorrer colecciones porque maneja la variable de iteración por ti. Puedes definir rangos con .., recorrer en reversa con downTo o saltar valores con step.
- Rango ascendente:
for (i in 0..5) imprime de 0 a 5 incluyendo ambos extremos.
- Rango descendente:
for (i in 5 downTo 0) recorre de 5 a 0.
- Rango con pasos:
for (i in 0..10 step 2) salta de dos en dos: 0, 2, 4, 6, 8, 10.
Cuando recorres un array, Kotlin infiere automáticamente el rango desde la posición cero hasta el final:
kotlin
val emails = listOf("juan@test.com", "carlos@test.com", "wilson@test.com")
for (email in emails) {
println("Correo actual: $email")
}
Aquí no te preocupas por índices ni incrementos. Cada elemento se asigna a la variable email en cada iteración.
¿Se puede recorrer un array con while?
Sí, pero necesitas más código. Debes declarar un índice manual, controlarlo con emails.size - 1 e incrementarlo en cada vuelta:
kotlin
var indiceEmail = 0
while (indiceEmail <= emails.size - 1) {
println(emails[indiceEmail])
indiceEmail += 1
}
Funciona igual, pero el for es más limpio cuando sabes que vas a recorrer cada elemento.
Ejercicio práctico: ¿cómo contar emails válidos con for y while?
El reto: leer tres correos por consola con un for y readLine(), recorrerlos con un while y contar cuántos contienen el símbolo @.
kotlin
val emails = mutableListOf<String>()
for (i in 1..3) {
print("Email $i: ")
val entrada = readLine() ?: "email$i@test.com"
emails.add(entrada)
}
var contador = 0
var posicion = 0
while (posicion < emails.size) {
if (emails[posicion].contains("@")) {
contador += 1
}
posicion += 1
}
println("Emails válidos: $contador")
Fíjate en dos detalles. Primero, posicion < emails.size equivale a posicion <= emails.size - 1; son dos formas de expresar lo mismo. Segundo, mutableListOf<String>() te permite agregar elementos con add() dentro del bucle, algo que no podrías hacer con una lista inmutable.
Conceptos clave que aparecen en la clase
- Loop o bucle: estructura que repite instrucciones mientras se cumpla una condición [00:23].
- Variable de control: la que decides modificar (como
emailsPendientes) para que el ciclo termine [02:14].
- Operador
-=: decrementa una variable. Equivalente a variable = variable - 1 [02:38].
- Rango con
..: define un intervalo inclusivo, por ejemplo 0..5 [05:32].
downTo: recorre un rango en orden inverso [07:08].
step: define el salto entre iteraciones del rango [07:35].
mutableListOf: crea listas a las que puedes agregar o quitar elementos [11:42].
readLine(): lee una línea desde consola, útil para capturar input del usuario [11:50].
contains(): valida si un string incluye un carácter o subcadena [12:30].
Si llegaste hasta aquí dominando cuándo usar for, while o do-while, estás listo para el siguiente paso: la programación orientada a objetos y las clases. Cuéntame en los comentarios qué tipo de tareas repetitivas resolverías con loops en tu día a día.