Menu
CoddyTech

Iterable dan Iterator

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 68 dari 110.

Setiap kali kamu menggunakan perulangan for-in pada List, Set, atau koleksi lainnya, kamu menggunakan Iterable dan Iterator di balik layar. Memahami konsep-konsep ini memungkinkanmu membuat class sendiri yang bisa digunakan dalam perulangan.

Iterable adalah object apa pun yang dapat menghasilkan rangkaian nilai. Ada satu persyaratan utama: getter iterator yang mengembalikan Iterator. Iterator inilah yang sebenarnya bergerak melalui elemen satu per satu:

var numbers = [1, 2, 3];
var iterator = numbers.iterator;

while (iterator.moveNext()) {
  print(iterator.current);  // 1, lalu 2, lalu 3
}

method moveNext() berpindah ke elemen berikutnya dan mengembalikan true jika ada, atau false jika sudah selesai. property current memberikan elemen saat ini.

Untuk membuat class-mu sendiri dapat diiterasi, implementasikan interface Iterable:

class Countdown extends Iterable<int> {
  final int start;
  Countdown(this.start);
  
  @override
  Iterator<int> get iterator => CountdownIterator(start);
}

class CountdownIterator implements Iterator<int> {
  int _current;
  
  CountdownIterator(int start) : _current = start + 1;
  
  @override
  int get current => _current;
  
  @override
  bool moveNext() {
    if (_current > 0) {
      _current--;
      return true;
    }
    return false;
  }
}

void main() {
  for (var n in Countdown(3)) {
    print(n);  // 3, 2, 1, 0
  }
}

Sekarang Countdown berfungsi dengan perulangan for-in dan semua method Iterable seperti map, where, dan fold. Pola ini penting saat membangun koleksi khusus yang terintegrasi dengan mulus ke dalam ekosistem koleksi Dart.

challenge icon

Tantangan

Mudah

Mari buat generator rentang khusus yang bisa diiterasi menggunakan perulangan for-in! Kamu akan membuat class Iterable dan Iterator sendiri untuk menghasilkan urutan angka dalam rentang yang ditentukan.

Kamu akan menyusun kodemu ke dalam dua file:

  • range.dart: Buat dua class yang bekerja sama untuk menghasilkan urutan angka:
    • Class RangeIterator yang mengimplementasikan Iterator<int>. Class ini harus melacak posisi saat ini dan mengetahui kapan harus berhenti. Iterator dimulai sebelum elemen pertama, jadi moveNext() harus dipanggil sebelum mengakses current.
    • Class Range yang memperluas Iterable<int>. Class ini menerima nilai start dan end dalam konstruktornya, serta menyediakan getter iterator yang mengembalikan RangeIterator.
    Rentang harus mencakup start dan end. Contohnya, Range(1, 5) harus menghasilkan: 1, 2, 3, 4, 5.
  • main.dart: Impor file rentangmu dan tunjukkan iterable khusus buatanmu:
    • Buat Range(1, 5) dan gunakan perulangan for-in untuk mencetak setiap angka pada barisnya sendiri
    • Cetak satu baris kosong
    • Buat Range(10, 13) dan gunakan method map untuk menggandakan setiap nilai, lalu cetak list hasilnya

Karena class Range-mu memperluas Iterable, class tersebut otomatis mendapatkan akses ke semua method koleksi yang canggih, seperti map, where, dan fold. Itulah keunggulan mengimplementasikan antarmuka Iterable!

Output yang diharapkan:

1
2
3
4
5

[20, 22, 24, 26]

Coba sendiri

import 'range.dart';

void main() {
  // TODO: Buat Range(1, 5) dan gunakan loop for-in untuk mencetak setiap angka
  
  
  // TODO: Cetak satu baris kosong
  
  
  // TODO: Buat Range(10, 13), gunakan map untuk menggandakan setiap nilai, lalu cetak list tersebut
  
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online