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);
}