"Hai, Amigo!"

"Hai, Elli!"

"Hari ini saya ingin memberi tahu Anda tentang iterator."

"Iterator ditemukan secara praktis bersamaan dengan koleksi. Tujuan utama koleksi adalah untuk menyimpan elemen, dan tujuan utama iterator adalah mengambil elemen ini satu per satu."

"Apa susahnya mendapatkan satu set elemen?"

"Pertama, elemen dalam beberapa koleksi, seperti Set, tidak memiliki urutan yang ditetapkan dan/atau urutannya terus berubah."

"Kedua, beberapa struktur data dapat menyimpan objek dengan cara yang sangat kompleks: dalam grup yang berbeda, daftar, dll. Dengan kata lain, membagikan semua elemen secara berurutan akan menjadi tugas yang tidak sepele."

"Ketiga, koleksi cenderung berubah. Misalkan Anda memutuskan untuk menampilkan seluruh konten koleksi, tetapi tepat di tengah keluaran, JVM beralih ke utas lain yang menggantikan setengah elemen koleksi. Jadi alih-alih keluaran, Anda mendapatkan siapa yang tahu apa."

"Hmm..."

"Tapi! Ini adalah jenis masalah yang dapat diselesaikan oleh iterator. Iterator adalah objek khusus dalam koleksi yang, di satu sisi, memiliki akses ke semua data pribadinya dan mengetahui struktur internalnya, dan di sisi lain , mengimplementasikan antarmuka Iterator publik, yang memungkinkan semua orang mengetahui cara bekerja dengannya. "

"Beberapa iterator memiliki larik internal tempat semua elemen koleksi disalin saat iterator dibuat. Hal ini memastikan bahwa setiap perubahan selanjutnya pada koleksi tidak akan memengaruhi jumlah atau urutan elemen."

"Saya pikir Anda telah menemukan ini ketika bekerja dengan untuk setiap . Anda tidak dapat secara bersamaan mengulang koleksi dan menghapus elemen darinya. Ini semua justru karena cara kerja iterator."

"Dalam koleksi baru yang ditambahkan ke perpustakaan konkurensi, iterator dikerjakan ulang untuk menghilangkan masalah ini."

"Izinkan saya mengingatkan Anda bagaimana sebuah iterator bekerja."

"Java memiliki antarmuka Iterator khusus. Berikut metodenya:"

Metode antarmuka Iterator<E> Keterangan
boolean hasNext() Periksa apakah ada elemen lagi
E next() Mengembalikan elemen saat ini dan berpindah ke elemen berikutnya.
void remove() Menghapus elemen saat ini

"Sebuah iterator memungkinkan Anda mendapatkan semua elemen koleksi secara berturut-turut. Lebih logis untuk menganggap iterator sebagai sesuatu seperti InputStream - ia memiliki semua data, tetapi tugasnya adalah mengeluarkannya secara berurutan."

"   Metode () berikutnya mengembalikan elemen berikutnya dalam koleksi."

" Metode hasNext () digunakan untuk memeriksa apakah ada elemen lagi."

"Dan hapus () menghapus elemen saat ini."

"Ada pertanyaan?"

"Mengapa metode memiliki nama yang aneh? Mengapa tidak isEmpty() dan getNextElement()?"

"Bukankah itu lebih masuk akal?"

"Itu akan lebih masuk akal, tetapi namanya berasal dari bahasa C++, tempat iterator muncul sebelumnya."

"Begitu. Mari kita lanjutkan."

"Selain iterator, ada juga antarmuka Iterable, yang harus diimplementasikan oleh semua koleksi yang mendukung iterator. Ia memiliki metode tunggal:"

Metode antarmuka Iterable<T> Keterangan
Iterator<T>iterator() Mengembalikan objek iterator

"Anda dapat menggunakan metode ini pada koleksi apa pun untuk membuat objek iterator menelusuri elemen-elemennya. Mari kita telusuri semua elemen dalam TreeSet : "

Contoh
TreeSet<String> set = new TreeSet<String>();
Iterator<String> iterator = set.iterator();

while (iterator.hasNext())
{
 String item = iterator.next();
 System.out.println(item);
}

"Menggunakan iterator seperti ini sangat tidak nyaman — terlalu banyak kode yang berlebihan dan jelas. Situasinya menjadi lebih sederhana ketika for -each loop muncul di Java."

"Sekarang kode ini jauh lebih ringkas dan mudah dibaca:"

Sebelum Setelah
TreeSet<String> set = new TreeSet<String>();
Iterator<String> iterator = set.iterator();

while (iterator.hasNext())
{
 String item = iterator.next();
 System.out.println(item);
}
TreeSet<String> set = new TreeSet<String>();

for(String item : set)
{
 System.out.println(item);
}

"Ini adalah kode yang sama! Iterator digunakan dalam kedua kasus tersebut."

"Hanya saja penggunaannya disembunyikan di for-each loop. Perhatikan bahwa kode di sebelah kanan tidak memiliki teks merah sama sekali. Penggunaan iterator benar-benar tersembunyi."

"Sebuah perulangan untuk setiap digunakan untuk objek apa pun yang mendukung iterator. Dengan kata lain, Anda dapat menulis kelas Anda sendiri, menambahkan metode iterator () ke dalamnya, dan menggunakan objeknya dalam konstruksi untuk setiap perulangan."

"Wow! Tentu saja, saya tidak ingin menulis koleksi dan iterator saya sendiri, tetapi prospeknya masih menggoda. Saya akan mencatatnya."

Selain itu, ada jenis iterator populer lainnya yang bahkan memiliki antarmuka sendiri. Saya berbicara tentang iterator untuk daftar, yaitu ListIterator .

"Terlepas dari penerapannya, daftar mempertahankan urutan elemen, yang membuat bekerja dengannya melalui iterator sedikit lebih nyaman."

"Berikut adalah metode antarmuka ListIterator <E>:"

metode Keterangan
boolean hasNext() Memeriksa apakah ada elemen lagi di depan.
E next() Mengembalikan elemen berikutnya.
int nextIndex() Mengembalikan indeks elemen berikutnya
void set(E e) Mengubah nilai elemen saat ini
boolean hasPrevious() Periksa apakah ada elemen di belakang.
E previous() Mengembalikan elemen sebelumnya
int previousIndex() Mengembalikan indeks elemen sebelumnya
void remove() Menghapus elemen saat ini
void add(E e) Menambahkan elemen ke akhir daftar.

"Dengan kata lain, di sini kita bisa bergerak maju dan mundur. Dan ada beberapa fitur kecil lainnya."

"Wah, itu hal yang menarik. Di mana itu digunakan?"

"Misalkan Anda ingin berpindah-pindah pada daftar tertaut. Operasi get akan agak lambat, tetapi operasi next() akan sangat cepat."

"Hmm. Kamu meyakinkanku. Aku akan mengingatnya."

"Terima kasih, Ellie!"