Laços Loops

1. Padrão for padrão

Sintaxe: for(inicialização; condição; iterador) { corpo do laço }

1: Concatenação básica de string

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

O laço percorre de 0 até 5 (não inclui o 5), ou seja, i recebe valores de 0 a 4, executando cinco vezes no total. Cada vez um ponto de exclamação é adicionado no final da string welcome to FoxDevelop.com.

1ª vez: welcome to FoxDevelop.com!

2ª vez: welcome to FoxDevelop.com!!

5ª vez: welcome to FoxDevelop.com!!!!!

Característica: closure captura índice independente (grande diferença em relação ao JavaScript)

No Dart, cada repetição do laço cria uma variável i independente, evitando o problema comum do JS onde todos os callbacks imprimem apenas o valor final 2.

void main() {
  var callbacks = [];
  for (var i = 0; i < 2; i++) {
    callbacks.add(() => print(i));
  }
  for (final c in callbacks) {
    c();
  }
}
// Saída
// 0
// 1
Code language: Dart (dart)

2. for-in para percorrer objetos iteráveis List/Set

Indicado para casos onde você só precisa dos valores dos elementos, sem os índices.

Forma básica

class Candidate {
  void interview() => print("Entrevista concluída");
}

void main() {
  var candidates = [Candidate(), Candidate()];
  for (var candidate in candidates) {
    candidate.interview();
  }
}Code language: Dart (dart)

Percorre a lista candidates, armazena cada elemento na variável candidate e executa o método interview(). Após ler cada item, o iterador avança automaticamente para o próximo.

Avançado

for-in com desestruturação de padrão 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),
  ];

  // Desestrutura campos diretamente via padrão de objeto
  for (final Candidate(:name, :yearsExperience) in candidates) {
    print('$name tem $yearsExperience anos de experiência profissional');
  }
}
Code language: Dart (dart)

Combinado com a desestruturação apresentada antes, extrai automaticamente as duas propriedades do objeto para as variáveis name e yearsExperience, que podem ser usadas no corpo do laço.

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

Percurso funcional nativo das coleções, recebendo uma função callback para processar cada elemento.

void main() {
  var collection = [1, 2, 3];
  collection.forEach(print);
  // Saída 1 2 3
}Code language: Dart (dart)

forEach é um método nativo do Dart disponível em todas as coleções iteráveis.

4. while / do-while

1. while

Avalia a condição primeiro antes de executar o bloco; pode não rodar nenhuma vez. Funciona igual a C, C++, Java, C# e outras linguagens.

bool isDone() => false;
void doSomething() => print("Executar tarefa");

void main() {
  while (!isDone()) {
    doSomething();
    break;
  }
}Code language: Dart (dart)

Primeiro avaliamos !isDone(): a função retorna false, a negação vira true, então o bloco interno é executado:

doSomething();
break;

Ao encontrar o break, todo o laço é encerrado e o código após o bloco while é executado. Se isDone() retornasse true, a primeira verificação falharia e o código interno nunca rodaria.

2. do-while

Executa o bloco uma vez sem condição, depois verifica a restrição: garante pelo menos uma execução.

bool atEndOfPage() => true;
void printLine() => print("Imprimir uma linha");

void main() {
  do {
    printLine();
  } while (!atEndOfPage());
}
Code language: Dart (dart)

Independente da condição do while ser true ou false, o código dentro do do {} sempre executa uma vez.

5. break / continue

break

Encerra todo o laço instantaneamente e pula para as linhas seguintes; o restante do bloco não é executado.

bool shutDownRequested() => true;
void processIncomingRequests() => print("Processar requisições");

void main() {
  while (true) {
    if (shutDownRequested()) break;
    processIncomingRequests();
  }
  print("Laço finalizado");
}
Code language: Dart (dart)

continue

Pula todas as linhas restantes da repetição atual e vai direto para a próxima repetição.

Forma tradicional com for
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; // Candidatos com menos de 5 anos de experiência são ignorados
    }
    candidate.interview();
  }
}
Code language: Dart (dart)
Alternativa funcional (sem continue)
void main() {
  var candidates = [Candidate(3), Candidate(6)];
  candidates
      .where((c) => c.yearsExperience >= 5)
      .forEach((c) => c.interview());
}
Code language: Dart (dart)

6. Rótulo Label para controle de laços aninhados

Sintaxe: colocar nomeRotulo: antes de um laço, usar com break nomeRotulo / continue nomeRotulo

Finalidade: com vários laços aninhados, sair ou pular diretamente o laço externo, não apenas o interno.

1. break + label

Sair de um laço duplo de uma vez

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; // Encerrar imediatamente o laço externo marcado outerLoop
      }
    }
  }
  print('outerLoop exited');
}
Code language: Dart (dart)

Saída:

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited
Code language: Dart (dart)

2. continue + label

Ir direto para a próxima repetição do laço externo

void main() {
  outerLoop:
  for (var i = 1; i <= 3; i++) {
    for (var j = 1; j <= 3; j++) {
      if (i == 2 && j == 2) {
        continue outerLoop; // Ignora todos os j restantes de i=2 e pula para i=3
      }
      print('i = $i, j = $j');
    }
  }
}
Code language: Dart (dart)

Saída:

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

Exemplo 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');
}
Code language: PHP (php)

Resultado da execução

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

Esse mecanismo tem comportamento semelhante ao comando goto de outras linguagens de programação.

Laços Loops

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *