Perulangan Loops

1. Perulangan for standar

Sintaks: for(inisialisasi; syarat; iterator) { isi perulangan }

1: Penggabungan string dasar

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)

Perulangan berjalan dari 0 sampai 5 (angka 5 tidak termasuk), variabel i bernilai 0 hingga 4 dan dijalankan sebanyak lima kali. Setiap iterasi menambahkan tanda seru di akhir string welcome to FoxDevelop.com.

Iterasi ke-1: welcome to FoxDevelop.com!

Iterasi ke-2: welcome to FoxDevelop.com!!

Iterasi ke-5: welcome to FoxDevelop.com!!!!!

Fitur: Closure menangkap indeks terpisah (perbedaan penting dengan JavaScript)

Dart mengikat variabel i yang mandiri pada setiap perulangan, sehingga tidak terjadi kesalahan JavaScript di mana semua callback hanya menampilkan angka 2.

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

2. for-in untuk melintasi objek Iterable List/Set

Cocok jika hanya memerlukan nilai elemen tanpa indeks.

Penulisan dasar

class Candidate {
  void interview() => print("Wawancara selesai");
}

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

Melintasi daftar candidates, menyimpan setiap elemen ke variabel candidate lalu memanggil fungsi interview(). Setelah satu elemen diproses, iterator otomatis berpindah ke item berikutnya.

Penggunaan Lanjutan

for-in dengan destrukturisasi pola objek (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),
  ];

  // Destrukturisasi field langsung melalui pola objek
  for (final Candidate(:name, :yearsExperience) in candidates) {
    print('$name memiliki pengalaman kerja $yearsExperience tahun');
  }
}
Code language: Dart (dart)

Dikombinasikan dengan destrukturisasi sebelumnya, secara otomatis mengambil dua properti objek ke variabel name dan yearsExperience yang dapat langsung digunakan di dalam isi perulangan.

3. Metode pelintasan Iterable.forEach ()

Pelintasan fungsional bawaan koleksi, gunakan callback untuk memproses tiap elemen.

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

forEach adalah metode asli Dart yang tersedia di semua koleksi iterabel.

4. while / do-while

1. while

Memeriksa syarat terlebih dahulu sebelum menjalankan isi; bisa jadi tidak berjalan sama sekali. Logikanya sama dengan C, C++, Java, C# dan bahasa lainnya.

bool isDone() => false;
void doSomething() => print("Jalankan tugas");

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

Pertama evaluasi !isDone(): fungsi mengembalikan false, negasi menjadi true sehingga blok di dalam dijalankan:

doSomething();
break;

Saat bertemu break, seluruh perulangan langsung diakhiri dan melompat ke kode setelah blok while. Jika isDone() mengembalikan true, pengecekan pertama gagal dan kode di dalam tidak pernah berjalan.

2. do-while

Menjalankan isi sekali terlebih dahulu baru cek syarat; minimal satu kali eksekusi pasti terjadi.

bool atEndOfPage() => true;
void printLine() => print("Cetak satu baris");

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

Apapun nilai syarat di belakang while (true/false), kode di dalam do {} pasti dijalankan satu kali.

5. break / continue

break

Mengakhiri seluruh perulangan seketika dan melompat ke baris berikutnya; sisa kode di dalam isi tidak dijalankan.

bool shutDownRequested() => true;
void processIncomingRequests() => print("Proses permintaan");

void main() {
  while (true) {
    if (shutDownRequested()) break;
    processIncomingRequests();
  }
  print("Perulangan selesai");
}
Code language: Dart (dart)

continue

Melewatkan semua sisa kode iterasi saat ini dan langsung lanjut ke perulangan berikutnya.

Penulisan for tradisional
class Candidate {
  final int yearsExperience;
  Candidate(this.yearsExperience);
  void interview() => print("Lakukan wawancara");
}

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; // Lewati wawancara kandidat dengan pengalaman kurang dari 5 tahun
    }
    candidate.interview();
  }
}
Code language: Dart (dart)
Alternatif fungsional (tanpa continue)
void main() {
  var candidates = [Candidate(3), Candidate(6)];
  candidates
      .where((c) => c.yearsExperience >= 5)
      .forEach((c) => c.interview());
}
Code language: Dart (dart)

6. Label untuk kontrol perulangan bersarang

Sintaks: tulis NamaLabel: sebelum perulangan, gunakan bersama break NamaLabel / continue NamaLabel

Kegunaan: jika ada banyak perulangan bersarang, bisa langsung keluar atau lewati perulangan luar, bukan hanya bagian dalam.

1. break + label

Keluar dari dua lapis perulangan sekaligus

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; // Akhiri langsung perulangan luar yang diberi label outerLoop
      }
    }
  }
  print('outerLoop exited');
}
Code language: Dart (dart)

Keluaran:

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

Langsung lompat ke iterasi berikutnya perulangan luar

void main() {
  outerLoop:
  for (var i = 1; i <= 3; i++) {
    for (var j = 1; j <= 3; j++) {
      if (i == 2 && j == 2) {
        continue outerLoop; // Lewati semua sisa j untuk i=2, langsung ke i=3
      }
      print('i = $i, j = $j');
    }
  }
}
Code language: Dart (dart)

Keluaran:

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

Contoh 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)

Hasil eksekusi

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

Mekanisme ini mirip dengan perintah goto di bahasa pemrograman lain.

Perulangan Loops

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *