Почему итератор Java не является итерируемым? - PullRequest
166 голосов
/ 08 мая 2009

Почему интерфейс Iterator не расширяется Iterable?

Метод iterator() может просто возвращать this.

Это специально или просто недосмотр разработчиков Java?

Было бы удобно иметь возможность использовать цикл for-each с итераторами, подобными этому:

for(Object o : someContainer.listSomeObjects()) {
    ....
}

где listSomeObjects() возвращает итератор.

Ответы [ 15 ]

0 голосов
/ 30 июля 2016

Итераторы с состоянием, имеют «следующий» элемент и становятся «исчерпанными» после итерации. Чтобы увидеть, в чем проблема, запустите следующий код, сколько цифр напечатано?

Iterator<Integer> iterator = Arrays.asList(1,2,3).iterator();
Iterable<Integer> myIterable = ()->iterator;
for(Integer i : myIterable) System.out.print(i);
System.out.println();
for(Integer i : myIterable) System.out.print(i);
0 голосов
/ 16 марта 2015

В соответствующей заметке вы можете найти адаптер IteratorIterable в Apache Commons Collections4 полезным. Просто создайте экземпляр из итератора, и у вас появится соответствующий итератор.

https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/iterators/IteratorIterable.html

ID: org.apache.commons: commons-collection4: 4.0

0 голосов
/ 19 июня 2013

Вы можете попробовать следующий пример:

List ispresent=new ArrayList();
Iterator iterator=ispresent.iterator();
while(iterator.hasNext())
{
    System.out.println(iterator.next());
}
0 голосов
/ 09 ноября 2010

Как отступление: у Scala есть метод toIterable () в Iterator. См. неявное или явное преобразование scala из итератора в итеративное

0 голосов
/ 08 мая 2009

Для простоты Iterator и Iterable - это две разные концепции, Iterable - это просто сокращение от «Я могу вернуть Iterator». Я думаю, что ваш код должен быть:

for(Object o : someContainer) {
}

с экземпляром someContainer SomeContainer extends Iterable<Object>

...