Bucles Loops

1. Bucle for estándar

Sintaxis: for(inicialización; condición; iterador) { cuerpo del bucle }

1: Concatenación básica de cadenas

void main() {
  var message = StringBuffer('welcome to FoxDevelop.com');
  for (var i = 0; i < 5; i++) {
    message.write('!');
  }
  print(message); // welcome to FoxDevelop.com!!!!!
}Lenguaje del código: Dart (dart)

El bucle recorre desde 0 hasta 5 (sin incluir el 5), es decir, i toma valores del 0 al 4, ejecutándose un total de cinco veces. En cada iteración se añade un signo de exclamación al final de la cadena welcome to FoxDevelop.com.

1ª iteración: welcome to FoxDevelop.com!

2ª iteración: welcome to FoxDevelop.com!!

5ª iteración: welcome to FoxDevelop.com!!!!!

Característica: las clausuras capturan índices independientes (diferencia clave con JavaScript)

En Dart cada iteración del bucle vincula una variable i independiente, evitando el fallo típico de JavaScript donde todas las funciones callback imprimen el valor final 2.

void main() {
  var callbacks = [];
  for (var i = 0; i < 2; i++) {
    callbacks.add(() => print(i));
  }
  for (final c in callbacks) {
    c();
  }
}
// Salida
// 0
// 1
Lenguaje del código: Dart (dart)

2. Bucle for-in para recorrer objetos iterables List/Set

Ideal cuando solo necesitas los valores de los elementos y no sus índices.

Sintaxis básica

class Candidate {
  void interview() => print("Entrevista finalizada");
}

void main() {
  var candidates = [Candidate(), Candidate()];
  for (var candidate in candidates) {
    candidate.interview();
  }
}Lenguaje del código: Dart (dart)

Recorre la lista candidates, asigna cada elemento a la variable candidate y llama a su método interview(). Después de procesar cada elemento, el iterador avanza automáticamente al siguiente.

Uso avanzado

for-in combinado con desestructuración de patrones de objeto (Dart 3+)

class Candidate {
  final String name;
  final int yearsExperience;
  Candidate({required this.name, required this.yearsExperience});
}

void main() {
  var candidates = [
    Candidate(name: "Lily", yearsExperience: 6),
    Candidate(name: "Tom", yearsExperience: 3),
  ];

  // Desestructurar campos directamente mediante patrón de objeto
  for (final Candidate(:name, :yearsExperience) in candidates) {
    print('$name cuenta con $yearsExperience años de experiencia laboral');
  }
}
Lenguaje del código: Dart (dart)

Combinado con la desestructuración vista anteriormente, extrae automáticamente las dos propiedades del objeto a las variables name y yearsExperience, listas para usar dentro del cuerpo del bucle.

3. Método de recorrido Iterable.forEach ()

Recorrido funcional nativo de las colecciones; pasa una función callback para procesar cada elemento.

void main() {
  var collection = [1, 2, 3];
  collection.forEach(print);
  // Salida 1 2 3
}Lenguaje del código: Dart (dart)

forEach es un método nativo de Dart disponible en cualquier colección iterable.

4. while / do-while

1. while

Evalúa la condición primero y luego ejecuta el cuerpo; es posible que el bloque no se ejecute nunca. Funciona igual que en C, C++, Java, C# y otros lenguajes.

bool isDone() => false;
void doSomething() => print("Ejecutar tarea");

void main() {
  while (!isDone()) {
    doSomething();
    break;
  }
}Lenguaje del código: Dart (dart)

Primero se evalúa !isDone(): la función devuelve false, la negación da true, por lo que se ejecuta el bloque interno:

doSomething();
break;

Al alcanzar break, se finaliza todo el bucle y se salta al código posterior al bloque while. Si isDone() devolviera true, la primera comprobación fallaría y el código interno no se ejecutaría en absoluto.

2. do-while

Ejecuta el cuerpo una vez sin condición previa y luego evalúa la restricción: se garantiza al menos una ejecución.

bool atEndOfPage() => true;
void printLine() => print("Imprimir una línea");

void main() {
  do {
    printLine();
  } while (!atEndOfPage());
}
Lenguaje del código: Dart (dart)

Independientemente de si la condición del while final es true o false, el código dentro de do {} se ejecuta obligatoriamente una vez.

5. break / continue

break

Termina todo el bucle instantáneamente y salta a las instrucciones siguientes; el resto del cuerpo no se ejecuta.

bool shutDownRequested() => true;
void processIncomingRequests() => print("Procesar peticiones");

void main() {
  while (true) {
    if (shutDownRequested()) break;
    processIncomingRequests();
  }
  print("Fin del bucle");
}
Lenguaje del código: Dart (dart)

continue

Omite todas las instrucciones restantes de la iteración actual y salta directamente a la siguiente iteración.

Sintaxis for tradicional
class Candidate {
  final int yearsExperience;
  Candidate(this.yearsExperience);
  void interview() => print("Realizar entrevista");
}

void main() {
  var candidates = [Candidate(3), Candidate(6)];
  for (int i = 0; i < candidates.length; i++) {
    var candidate = candidates[i];
    if (candidate.yearsExperience < 5) {
      continue; // Saltar entrevista a candidatos con menos de 5 años de experiencia
    }
    candidate.interview();
  }
}
Lenguaje del código: Dart (dart)
Alternativa funcional (sin continue)
void main() {
  var candidates = [Candidate(3), Candidate(6)];
  candidates
      .where((c) => c.yearsExperience >= 5)
      .forEach((c) => c.interview());
}
Lenguaje del código: Dart (dart)

6. Etiquetas Label para controlar bucles anidados

Sintaxis: escribir nombreEtiqueta: antes de un bucle, combinar con break nombreEtiqueta / continue nombreEtiqueta

Propósito: en bucles múltiples anidados, salir o saltar directamente el bucle exterior, no solo el interior.

1. break + label

Salir de un bucle doble completo

void main() {
  outerLoop:
  for (var i = 1; i <= 3; i++) {
    for (var j = 1; j <= 3; j++) {
      print('i = $i, j = $j');
      if (i == 2 && j == 2) {
        break outerLoop; // Finalizar inmediatamente el bucle exterior marcado outerLoop
      }
    }
  }
  print('outerLoop exited');
}
Lenguaje del código: Dart (dart)

Salida:

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited
Lenguaje del código: Dart (dart)

2. continue + label

Saltar directamente a la siguiente iteración del bucle exterior

void main() {
  outerLoop:
  for (var i = 1; i <= 3; i++) {
    for (var j = 1; j <= 3; j++) {
      if (i == 2 && j == 2) {
        continue outerLoop; // Saltar todos los j restantes de i=2 y pasar directamente a i=3
      }
      print('i = $i, j = $j');
    }
  }
}
Lenguaje del código: Dart (dart)

Salida:

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 3, j = 1
i = 3, j = 2
i = 3, j = 3

Ejemplo while+break+label

void main() {
  var i = 1;
  outerLoop:
  while (i <= 3) {
    var j = 1;
    while (j <= 3) {
      print('i = $i, j = $j');
      if (i == 2 && j == 2) {
        break outerLoop;
      }
      j++;
    }
    i++;
  }
  print('outerLoop exited');
}
Lenguaje del código: PHP (php)

Resultado de ejecución

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited

Este mecanismo funciona de forma similar a la sentencia goto de otros lenguajes de programación.

Bucles Loops

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *