Iterator wewnętrzny i zewnętrzny

Iterator może występować w dwóch formach – wewnętrznej lub zewnętrznej.

Iterator wewnętrzny

To taki, którego przebiegu nie kontrolujemy sami – dostarczamy tylko algorytm, który ma zostać wykonany dla każdego elementu. Przykładem takiego iteratora jest metoda forEach interfejsu Iterable. A z racji tego, że każda kolekcja implementuje ten interfejs, to na każdej kolekcji możemy skorzystać z wewnętrznego iteratora:

List<String> names = SomeService.getNames();
names.forEach(name -> System.out.println(name));

Iterator zewnętrzny

Jest to tradycyjny iterator zwracany przez kolekcje przy użyciu metody interfejsu Iterable – iterator(). W tym wypadku mamy pełną kontrolę nad przechodzeniem po elementach:

List<String> names = SomeService.getNames();
Iterator<String> namesIterator = names.iterator();

while(namesIterator.hasNext()){
    String name = namesIterator.next();
    System.out.println(name);
}