Pojęcie iteratora jest ostatnim, które związane jest z kolekcjami. Są one alternatywą dla klasyczny pętli for oraz foreach. Każda z kolekcji Java, która dziedziczy po interfejsie Collection, posiada w swoim API operację o nazwie 'iterator’. Interfejs Iterator jest bardzo prostą strukturą udostępniającą właściwie tylko trzy metody: next, hasNext, oraz remove.
public static void main(String[] args) { List<String> movies = new ArrayList<>(); movies.add("Indiana Jones"); movies.add("Avengers"); movies.add("Star Wars"); Iterator<String> iterator = movies.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } }
Przeglądanie rekordów
Iteratory dobrze sprawdzają się wraz z pętlą while, ponieważ warunek stopu tej pętli jest typu boolean, także świetnie można go ustalić korzystając z metody hasNext. W przeciwieństwie pętli for, nie wskazuje się tu numeru indeksu, aby skorzystać z kolejnego wartości na liście. Wystarczy użyć metody next.
Ciekawostka. Jeśli napiszesz taki kod:
while (movies.iterator().hasNext()) { System.out.println(movies.iterator().next()); }
To niestety nie zadziała. Wydaje się, że kod jest tożsamy z powyższym, ale w rzeczywistości jest drobnym błędem, ponieważ Iterator będzie otwierał się za każdą iteracją.
Usuwanie elementów
Oprócz przeglądania kolejnych rekordów, interfejs Iterator umożliwia też usuwać rekordy używając metody remove.
while (iterator.hasNext()) { iterator.remove(); }
Interfejs iterator po swojemu
Jeśli interesuje Cię, jak samemu napisać własny iterator, przejrzyj tą lekcję: https://developeronthego.pl/java-zaawansowane-4-wlasny-iterator
Link do kodu: https://github.com/developeronthego/java-middle/tree/master/src/main/java/middle/lesson19