почему нельзя агрегировать объекты, просто реализуйте интерфейс Iterator и подразумевайте, что он итерируемый
Итератор имеет состояние . Он должен знать, какие элементы итератор уже возвратил, какие элементы не вернули, и какой элемент будет возвращен следующим.
Если коллекция была самой итератором, а расширенная для l oop работала на итераторах, вы не сможете выполнить итерацию дважды, как показано ниже:
for (Employee employee: employeeCollection) {
// do something
}
for (Employee employee: employeeCollection) {
// do something else
}
Когда первый l oop завершится, это означает, что вы достигли конца итерации. Поэтому второй l oop не может выполнять итерации для других элементов.
Можно утверждать, что запуск l oop может каким-то образом неявно "сбросить" итератор обратно к началу. Невозможно сбросить итератор, но это все равно не решит проблему. Как будет работать вложенная итерация, скажем, вы ищете пару сотрудников с одинаковым днем рождения?
for (Employee employee1: employeeCollection) {
for (Employee employee2: employeeCollection) {
// do something
}
}
Если внутренний for-l oop и внешний for-l oop совместно используют итератор В любом случае, этот алгоритм не может создать все пары сотрудников.
Вам действительно нужен способ создания итератора fre sh, который не зависит от других итераторов, которые могут существовать. Это то, что дает интерфейс Iterable
.