Panduan untuk Iterator di Jawa

1. Pengenalan

An Pelelar merupakan salah satu daripada banyak cara kita boleh merentasi koleksi, dan sebagai setiap pilihan, ia mempunyai kebaikan dan keburukan.

Ini pertama kali diperkenalkan di Java 1.2 sebagai pengganti Enumerasi dan:

  • memperkenalkan nama kaedah yang diperbaiki
  • memungkinkan untuk membuang elemen dari koleksi yang kami ulangi
  • tidak menjamin pesanan lelaran

Dalam tutorial ini, kita akan mengkaji antara muka Iterator yang mudah untuk mengetahui bagaimana kita boleh menggunakan kaedahnya yang berbeza.

Kami juga akan memeriksa sambungan ListIterator yang lebih mantap yang menambahkan beberapa fungsi menarik.

2. Antara Muka Iterator

Untuk memulakan, kita perlu mendapatkan Iterator dari Koleksi ; ini dilakukan dengan memanggil kaedah iterator () .

Untuk kesederhanaan, kami akan memperoleh contoh Iterator dari senarai:

List items = ... Iterator iter = items.iterator();

Antara muka Iterator mempunyai tiga kaedah teras:

2.1. hasNext ()

Kaedah hasNext () dapat digunakan untuk memeriksa apakah ada setidaknya satu elemen yang tersisa untuk berulang.

Ia direka untuk digunakan sebagai keadaan semasa gelung:

while (iter.hasNext()) { // ... }

2.2. seterusnya ()

Kaedah seterusnya () boleh digunakan untuk melangkah ke elemen seterusnya dan mendapatkannya:

String next = iter.next();

Sebaiknya gunakan hasNext () sebelum cuba memanggil seterusnya () .

Iterators for Collections tidak menjamin pengulangan dalam urutan tertentu kecuali pelaksanaan tertentu memberikannya.

2.3. alih keluar ()

Akhirnya, jika kita mahu membuang elemen semasa dari koleksi, kita boleh menggunakan hapus:

iter.remove();

Ini adalah kaedah yang selamat untuk membuang elemen semasa melakukan pengulangan pada koleksi tanpa risiko ConcurrentModificationException.

2.4. Contoh Iterator Penuh

Sekarang kita boleh menggabungkan semuanya dan melihat bagaimana kita menggunakan tiga kaedah bersama-sama untuk penyaringan koleksi:

while (iter.hasNext()) { String next = iter.next(); System.out.println(next); if( "TWO".equals(next)) { iter.remove(); } }

Ini adalah bagaimana kita biasanya menggunakan Iterator, kita memeriksa terlebih dahulu jika ada unsur lain, kita mengambilnya dan kemudian kita melakukan beberapa tindakan di atasnya.

2.5. Berterusan Dengan Ekspresi Lambda

Seperti yang kita lihat dalam contoh sebelumnya, sangat sukar untuk menggunakan Iterator ketika kita hanya ingin membahas semua elemen dan melakukan sesuatu dengannya.

Sejak Java 8, kami memiliki kaedah forEachRemaining yang memungkinkan penggunaan lambdas untuk memproses sisa elemen:

iter.forEachRemaining(System.out::println);

3. Antara Muka ListIterator

ListIterator adalah peluasan yang menambah fungsi baru untuk mengulangi senarai:

ListIterator listIterator = items.listIterator(items.size());

Perhatikan bagaimana kita dapat memberikan kedudukan permulaan yang dalam kes ini adalah akhir dari Daftar.

3.1. hasPre sebelumnya () dan sebelumnya ()

ListIterator boleh digunakan untuk traversal mundur sehingga memberikan setara dengan hasNext () dan next () :

while(listIterator.hasPrevious()) { String previous = listIterator.previous(); }

3.2. nextIndex () dan previousIndex ()

Selain itu, kita dapat melintasi indeks dan bukan elemen sebenar:

String nextWithIndex = items.get(listIterator.nextIndex()); String previousWithIndex = items.get(listIterator.previousIndex());

Ini mungkin terbukti sangat berguna sekiranya kita perlu mengetahui indeks objek yang sedang kita ubah, atau jika kita ingin menyimpan catatan elemen yang dihapus.

3.3. Tambah()

The add kaedah, yang, seperti namanya, membolehkan kita untuk menambah satu elemen sebelum perkara yang akan dikembalikan oleh seterusnya () dan selepas satu yang dikembalikan oleh sebelum ():

listIterator.add("FOUR");

3.4. tetapkan ()

Kaedah terakhir yang perlu disebutkan adalah set (), yang memungkinkan kita mengganti elemen yang dikembalikan dalam panggilan ke seterusnya () atau sebelumnya () :

String next = listIterator.next(); if( "ONE".equals(next)) { listIterator.set("SWAPPED"); }

Penting untuk diperhatikan bahawa ini hanya dapat dilaksanakan jika tidak ada panggilan sebelumnya untuk menambah () atau menghapus () .

3.5. Contoh Penyenaraian Penuh

Kita sekarang boleh menggabungkan semuanya untuk membuat contoh lengkap:

ListIterator listIterator = items.listIterator(); while(listIterator.hasNext()) { String nextWithIndex = items.get(listIterator.nextIndex()); String next = listIterator.next(); if("REPLACE ME".equals(next)) { listIterator.set("REPLACED"); } } listIterator.add("NEW"); while(listIterator.hasPrevious()) { String previousWithIndex = items.get(listIterator.previousIndex()); String previous = listIterator.previous(); System.out.println(previous); }

Dalam contoh ini, kita mulakan dengan mendapatkan ListIterator dari Daftar , kemudian kita dapat memperoleh elemen seterusnya baik dengan indeks - yang tidak meningkatkan elemen arus dalaman iterator - atau dengan memanggil berikutnya .

Kemudian kita boleh mengganti item tertentu dengan set dan memasukkan yang baru dengan tambah.

Setelah mencapai akhir lelaran, kita dapat mundur untuk mengubah elemen tambahan atau mencetaknya dari bawah ke atas.

4. Kesimpulan

Antara muka Iterator membolehkan kita mengubah koleksi semasa melintasinya, yang lebih sukar dengan pernyataan sederhana / /. Ini, pada gilirannya, memberi kita corak yang baik yang dapat kita gunakan dalam banyak kaedah yang hanya memerlukan pemrosesan koleksi sambil mempertahankan kohesi yang baik dan gandingan yang rendah.

Akhirnya, seperti biasa kod sumber lengkap boleh didapati di GitHub.