Бывают ли такие случаи, когда нужно прописывать и работать напрямую с итератором а не в foreach?
Согласен с Sergey Gornostaev, и в дополнении к прошлому посту: кроме модификации элементов коллекции, с помощью итератора можно "проходить" по всем элементам как прямом направлении, через методы:
MyIterator.hasNext(); //проверка наличия следующего элемента
MyIterator.next(); //обращение с следующему элементу
так и в обратном направлении (если после прохождения итератор указывает на конец коллекции)
MyIterator.hasPrevious(); //проверка наличия "предыдущего" элемента
MyIterator.previous(); //обращение к "предыдущему" элементу
В то время, как цикл типа foreach способен "проходить" только в прямом направлении.
Если вам нужно заменять или удалять элементы итерируемой коллекции.
Я только хотел добавить, что не только List'ом одним может быть реализован Iterable представьте себе допустим QuadTree, движение по List вперед да и назад вполне тривиально знай да меняй себе индекс, по дереву-же гулять "снаружи", не зная деталей вполне с таки сложно, однако, если реализован интерфейс Iterable, чтобы перейти к следующему узлу Вам нужно только лишь дернуть .next() итератора, а как итератор получит этот узел, дело разработчиков класса-итератора, а не управляющего кода. По-моему так (С) Винни-пух
Продвижение своими сайтами как стратегия роста и независимости