0Pricing
Java Academy · Pelajaran

Kontrak Iterable dan Iterator

Pahami interface Iterable dan Iterator serta cara kerja perulangan for-each secara internal.

Kontrak Iterable dan Iterator adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Iterable dan Iterator

Iterable<T> dan Iterator<T> adalah antarmuka yang menjalankan perulangan for-each Java. Dengan memahaminya, Anda dapat membuat struktur data sendiri yang kompatibel dengan perulangan.

Antarmuka Iterable

Iterable<T> memiliki satu metode: iterator() yang mengembalikan Iterator<T>. Kelas apa pun yang mengimplementasikan Iterable dapat digunakan dalam perulangan for-each.

// java.lang.Iterable<T>
interface Iterable<T> {
    Iterator<T> iterator();
    // default: forEach, spliterator (Java 8+)
}

// Any class implementing Iterable<T> works in for-each:
class Range implements Iterable<Integer> {
    private final int start, end;
    Range(int start, int end) { this.start = start; this.end = end; }

    public Iterator<Integer> iterator() {
        return new RangeIterator(); // defined separately
    }
}

Antarmuka Iterator

Iterator<T> memiliki tiga metode: hasNext(), next(), dan remove() opsional.

// java.util.Iterator<T>
interface Iterator<T> {
    boolean hasNext(); // true if more elements
    T next();          // returns next element, advances cursor
    default void remove() { throw new UnsupportedOperationException(); }
}

// How for-each desugars internally:
// for (T item : iterable) { use(item); }
// becomes:
Iterator<T> it = iterable.iterator();
while (it.hasNext()) {
    T item = it.next();
    // use(item)
}

Penguraian Sintaks Perulangan For-Each

Perulangan for-each merupakan penyederhanaan sintaksis dari pola Iterable/Iterator. Dengan memahaminya, Anda dapat menulis Iterable khusus dengan benar.

List<String> names = List.of("Alice", "Bob", "Charlie");

// For-each (readable way)
for (String name : names) {
    System.out.println(name);
}

// Equivalent explicit form
Iterator<String> it = names.iterator();
while (it.hasNext()) {
    String name = it.next();
    System.out.println(name);
}

Status Kursor Iterator

Sebuah Iterator mempertahankan kursor—posisi dalam urutan. Pemanggilan next() menggerakkan kursor ke depan. Setelah semua elemen dibaca, iterator tidak dapat diatur ulang.

List<Integer> nums = List.of(1, 2, 3);
Iterator<Integer> it = nums.iterator();

System.out.println(it.hasNext()); // true
System.out.println(it.next());    // 1
System.out.println(it.next());    // 2
System.out.println(it.next());    // 3
System.out.println(it.hasNext()); // false

try {
    it.next(); // NoSuchElementException
} catch (java.util.NoSuchElementException e) {
    System.out.println("No more elements!");
}

ConcurrentModificationException

Memodifikasi koleksi saat melakukan iterasi dengan iterator eksplisit, di luar Iterator.remove(), akan melempar ConcurrentModificationException.

List<String> list = new ArrayList<>(List.of("a", "b", "c", "d"));

// BAD: modifying collection during for-each
try {
    for (String s : list) {
        if ("b".equals(s)) list.remove(s); // ConcurrentModificationException!
    }
} catch (java.util.ConcurrentModificationException e) {
    System.out.println("Cannot modify during iteration!");
}

// GOOD: use Iterator.remove()
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    if ("b".equals(it.next())) it.remove(); // safe
}
System.out.println(list); // [a, c, d]

Beberapa Iterator

Setiap pemanggilan iterator() mengembalikan iterator baru yang independen. Beberapa iterator dapat aktif secara bersamaan pada koleksi yang sama.

List<Integer> nums = List.of(1, 2, 3);

Iterator<Integer> a = nums.iterator();
Iterator<Integer> b = nums.iterator();

System.out.println(a.next()); // 1
System.out.println(b.next()); // 1 (independent cursor)
System.out.println(a.next()); // 2
System.out.println(b.next()); // 2

Iterable vs Iterator

Perbedaan utama:

  • Iterable: sumber yang dapat menghasilkan iterator—dapat diiterasi berkali-kali
  • Iterator: kursor pada suatu urutan—hanya dapat digunakan sekali dan memiliki status
// Iterable: reusable
List<String> list = List.of("x", "y");
for (String s : list) {} // OK
for (String s : list) {} // OK again — new iterator each time

// Iterator: single-use
Iterator<String> it = list.iterator();
while (it.hasNext()) it.next();
// for (String s : it) {} // compile error — Iterator is not Iterable!

Praktik: Iterable Baris Berkas Khusus

Pembaca berkas yang mengimplementasikan Iterable agar perulangan for-each dapat dilakukan pada baris-barisnya.

import java.io.*;
import java.util.*;

class FileLines implements Iterable<String>, Closeable {
    private final BufferedReader reader;

    FileLines(String path) throws IOException {
        this.reader = new BufferedReader(new FileReader(path));
    }

    public Iterator<String> iterator() {
        return new Iterator<>() {
            private String nextLine = readNext();

            private String readNext() {
                try { return reader.readLine(); }
                catch (IOException e) { return null; }
            }

            public boolean hasNext() { return nextLine != null; }
            public String next() {
                String curr = nextLine;
                nextLine = readNext();
                return curr;
            }
        };
    }

    public void close() throws IOException { reader.close(); }
}

Metode Bawaan forEach

Java 8 menambahkan metode bawaan forEach(Consumer) ke Iterable. Metode ini merupakan alternatif praktis untuk menulis perulangan eksplisit.

List<String> cities = List.of("New York", "London", "Tokyo");

// for-each loop
for (String city : cities) System.out.println(city);

// forEach with lambda
cities.forEach(city -> System.out.println(city));

// forEach with method reference (most concise)
cities.forEach(System.out::println);

// For transforming: use stream
cities.stream()
    .map(String::toUpperCase)
    .forEach(System.out::println);

Pola Iterator dalam Praktik

Ringkasan kapan perlu mengimplementasikan Iterable/Iterator:

  • Struktur data khusus (pohon, graf, daftar tertaut)
  • Urutan malas yang menghasilkan elemen sesuai permintaan
  • Urutan berbasis sumber daya (baris berkas, kursor basis data, antrean pesan)

Pemeriksaan Singkat

Pengecualian apa yang dilempar saat Anda memodifikasi koleksi ketika melakukan iterasi dengan perulangan for-each?

Ringkasan: Kontrak Iterable dan Iterator

Inti pembelajaran:

  • Iterable memiliki satu metode: iterator()—memungkinkan dukungan untuk perulangan for-each
  • Iterator memiliki hasNext(), next(), dan remove() opsional
  • Perulangan for-each merupakan penyederhanaan sintaksis dari pola Iterable/Iterator
  • Panggil iterator() beberapa kali untuk mendapatkan kursor baru yang independen
  • Jangan pernah memodifikasi koleksi selama perulangan for-each—gunakan Iterator.remove() sebagai gantinya
  • Implementasikan Iterable pada struktur data khusus untuk mendukung perulangan for-each

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Kontrak Iterable dan Iterator” gratis?

Ya — teks lengkap “Kontrak Iterable dan Iterator” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Kontrak Iterable dan Iterator”?

Pahami interface Iterable dan Iterator serta cara kerja perulangan for-each secara internal. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Kontrak Iterable dan Iterator” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Kontrak Iterable dan Iterator
  2. Mengimplementasikan Iterator Kustom
  3. ListIterator dan Traversal Dua Arah
  4. Iterator Fail-Fast vs Fail-Safe
← Kembali ke Java Academy