Vodič za Iterator na Javi

1. Uvod

An Iterator jedan je od mnogih načina na koji možemo preći kolekciju, a kao i svaka opcija ima svoje prednosti i nedostatke.

Prvi je put predstavljen u Javi 1.2 kao zamjena za Nabrajanja i:

  • uveo poboljšana imena metoda
  • omogućilo uklanjanje elemenata iz zbirke koju ponavljamo
  • ne jamči redoslijed ponavljanja

U ovom uputstvu pregledat ćemo jednostavno Iterator sučelje kako bismo naučili kako možemo koristiti njegove različite metode.

Provjerit ćemo i robusnije ListIterator proširenje koje dodaje neku zanimljivu funkcionalnost.

2. The Iterator Sučelje

Za početak moramo dobiti Iterator od Kolekcija; to se postiže pozivanjem iterator () metoda.

Radi jednostavnosti dobit ćemo Iterator primjer s popisa:

Stavke na popisu = ... Iterator iter = items.iterator ();

The Iterator sučelje ima tri osnovne metode:

2.1. hasNext ()

The hasNext () metoda može se koristiti za provjeru postoji li preostao barem jedan element za iteraciju.

Dizajniran je da se koristi kao uvjet u dok petlje:

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

2.2. Sljedeći()

The Sljedeći() metoda se može koristiti za prelazak preko sljedećeg elementa i njegovo dobivanje:

Niz sljedeći = iter.next ();

Dobra je praksa za upotrebu hasNext () prije pokušaja poziva Sljedeći().

Iteratore za Zbirke ne garantirajte ponavljanje bilo kojim određenim redoslijedom, osim ako to predviđa posebna implementacija.

2.3. ukloniti()

Napokon, ako želimo ukloniti trenutni element iz zbirke, možemo koristiti ukloniti:

iter.remove ();

Ovo je siguran način uklanjanja elemenata tijekom iteracije preko zbirke bez rizika od a ConcurrentModificationException.

2.4. Puna Iterator Primjer

Sada ih možemo kombinirati i pogledati kako zajedno koristimo tri metode za filtriranje zbirki:

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

Na ovaj se način često koristimo Iterator, provjerimo prije vremena postoji li još jedan element, dohvatimo ga i zatim izvršimo neku radnju na njemu.

2.5. Iteriranje s Lambda izrazima

Kao što smo vidjeli u prethodnim primjerima, vrlo je opširno koristiti Iterator kad samo želimo preći preko svih elemenata i učiniti nešto s njima.

Od Jave 8 imamo forEachRemaining metoda koja omogućuje upotrebu lambdas-a za obradu preostalih elemenata:

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

3. The ListIterator Sučelje

ListIterator je proširenje koje dodaje novu funkcionalnost za ponavljanje popisa:

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

Primijetite kako možemo pružiti početnu poziciju koja je u ovom slučaju kraj Popis.

3.1. hasPrevious () i prethodni ()

ListIterator može se koristiti za okretanje unatrag tako da pruža ekvivalente hasNext () i Sljedeći():

while (listIterator.hasPrevious ()) {Niz prethodni = listIterator.previous (); }

3.2. nextIndex () i previousIndex ()

Uz to, možemo prelaziti preko indeksa, a ne stvarnih elemenata:

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

To bi se moglo pokazati vrlo korisnim u slučaju da moramo znati indekse objekata koje trenutno mijenjamo ili ako želimo voditi evidenciju o uklonjenim elementima.

3.3. dodati()

The dodati metoda koja nam, kao što i samo ime govori, omogućuje dodavanje elementa prije predmeta koji bi vratio Sljedeći() a nakon onog koji se vratio do prethodni ():

listIterator.add ("ČETIRI");

3.4. postavi ()

Posljednja metoda vrijedna spomena je set (), što nam omogućuje zamjenu elementa koji je vraćen u pozivu na Sljedeći() ili prethodni ():

Niz sljedeći = listIterator.next (); if ("ONE" .equals (next)) {listIterator.set ("SWAPPED"); }

Važno je to napomenuti ovo se može izvršiti samo ako nema prethodnih poziva na dodati() ili ukloniti() Su napravljeni.

3.5. Puna ListIterator Primjer

Sada ih sve možemo kombinirati kako bismo dali cjelovit primjer:

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

U ovom primjeru započinjemo dobivanjem datoteke ListIterator od Popis, tada sljedeći element možemo dobiti bilo indeksom -što ne povećava unutarnji trenutni element iteratora - ili pozivom Sljedeći.

Tada možemo zamijeniti određenu stavku s postavljen i umetnite novi sa dodati.

Nakon postizanja kraja iteracije možemo se vratiti unatrag kako bismo izmijenili dodatne elemente ili ih jednostavno ispisali odozdo prema gore.

4. Zaključak

The Iterator sučelje omogućuje nam izmjenu zbirke tijekom njenog obilaženja, što je teže s jednostavnim izrazom for / while. To nam zauzvrat daje dobar obrazac koji možemo koristiti u mnogim metodama koji zahtijeva samo obradu zbirki uz održavanje dobre kohezije i niske sprege.

Konačno, kao i uvijek puni izvorni kod dostupan je na GitHub-u.