Когда было бы полезно реализовать итератор без реализации итерации?Когда было бы полезно реализовать Iterator, но не Iterable?
Или реализует итератор просто по продукту реализации итерации?
Когда было бы полезно реализовать итератор без реализации итерации?Когда было бы полезно реализовать Iterator, но не Iterable?
Или реализует итератор просто по продукту реализации итерации?
Эти два взаимосвязанных, но не одинаковых.
A List
Iterable
- вы можете получить его Iterator
. Это не a Iterator
.
Iterator
является использование одного класса, который может итерацию вдоль Collection
объектов с использованием hasNext
и next
методы.
Iterable
класс Collection
, который возвращает экземпляр Iterator
, когда вызывается метод iterator()
.
Я бы зашел так далеко, чтобы сказать, что я вижу no случай, когда Iterable
должен implements Iterator
. А так как Iterator
является одноразовым, я не вижу случая, когда Iterator
должен implements Iterable
.
Они очень похожи в семантике и прецедентах, но отличаются в реализации. Iterable - простая фабрика для итераторов, которая может использоваться внутри для циклов. По этой причине было бы удобнее реализовать Iterable.
for(String s : getIterable()){
...
}
Versus:
Iterator<String> it = getIterator();
while(it.hasNext()){
String s = it.next();
...
}
Однако, в некоторых случаях итератор может не быть повторно инстанцирован, то есть, когда вы работаете через результаты запроса дБ, так что в этом случае вы не можете сделать он Итерируется без повторной отправки вашего запроса.
Вообще говоря, вы должны реализовать либо Iterable, либо Iterator, чтобы скрыть реализацию коллекции из кода, который выполняет итерацию по коллекции. Любой из них будет работать хорошо. Разница заключается в том, сколько раз сбор может быть пройден. Итератор может перемещаться только один раз, когда Iterable может пересекать коллекцию много раз. Вы можете пересечь Iterable, запросив его для Iterator, и вы можете сделать это несколько раз.
Итак, знаете ли вы пример, где бы я хотел, чтобы класс реализовал итератор без повторения? Как и в случае, когда было бы необходимо/более полезно только поперечно собирать коллекцию? – graviton
+1. Важной отличительной чертой является повторяемость или ее отсутствие. Рассмотрим строки чтения из сетевого подключения. Это совершенно разумный Итератор, но сделать его Iterable не работает. Что произойдет, если вызывающий абонент вызовет итератор() второй раз? –
'List' имеет' ListIterator', который расширяет 'Iterator'. Так почему: «Это не« Итератор »? – ferrerverck
Список реализует итерацию и имеет внутреннюю реализацию итератора правильно? Меня интересует реализация итератора без повторной реализации. – graviton
@ferrerverck 'List' _returns_ и' Итератор', потому что он 'Итерируемый'. Это, конечно, не «Итератор» - это задача «ListIterator». –