Синтаксис «для каждого» предназначен для коллекций (точнее, Iterable
), а не для итераторов. Я пытаюсь выяснить аргументы того, почему Java была разработана таким образом в этом вопросе .
Самое простое решение для вас - вернуть перевернутый список (который можно повторять) вместо итератора списка. Затем вы можете использовать сокращение для синтаксиса цикла.
Хакерский путь описан в вопросе , упомянутом ранее , с использованием класса Adapter, который переносит Iterator
в Iterable
и возвращает Iterator
при первом вызове iterator()
. Посмотрите на код адаптера, это довольно просто. Он служит цели, но поскольку итератор может быть использован только один раз, он является недопустимым Iterable
(он не сможет создать второй итератор).
Разница в поведении ключа проявляется при его двойном использовании:
for(Object a : foo) { }
for(Object a : foo) { }
будет обрабатывать все элементы в foo дважды , если это правильный Iterable
, но только один раз , если он использует адаптер, который я набросал - второй цикл ничего не сделает.