В чем разница между iterable и iterator java
Перейти к содержимому

В чем разница между iterable и iterator java

  • автор:

Вопрос №40649 от пользователя Daria Tsvetkova в уроке «Модуль 1. Урок 1. Iterator.», курс «Java: Структуры данных»

interface Iterable находится в пакете java.lang и имплементация этого интерфейса позволяет объекту быть итерируемым с помощью for-each. Из под реализации Iterable можно вызвать iterator . И не один. И даже в нескольких потоках. А может и не использовать итератор вовсе.

interface Iterator находится в пакете java.util . В его имплементации задаются правила обхода коллекции.

Да и названия интерфейсов говорят сами за себя:

  • Iterable (какое) — итерируемое. То по чему можно итерироваться. Имплементируется классом, по которому нужно будет итерироваться.
  • Iterator (кто/что) — инструмент итерирования по коллекции. Итератор это отдельный класс, как правило вложенный в итерируемый класс, который задает логику итерации по итерируемому. И, естественно, имплементирует интерфейс Iterator .

Зачем в Java 2 интерфейса: Iterable и Iterator?

По-моему они только вносят путаницу. Я так понял их роли: Iterable говорит что по объектам класса в принципе можно итерироваться, а Iterator задает сами методы для итерирования. Но по-моему все это отлично смотрелось бы в одном интерфейсе. Который и объявлял бы класс итерируемым и одновременно задавал бы методы для итерирования.

Отслеживать
задан 8 фев 2016 в 6:30
Александр Елизаров Александр Елизаров
2,788 2 2 золотых знака 17 17 серебряных знаков 36 36 бронзовых знаков

Иногда приходится решать задачи, требующие реализации своих итераторов и Iterable. Вот пример не совсем стандартной работы с коллекциями, здесь нужно обойти две коллекции в определённом порядке. Если бы это была одна сущность, всё было бы заметно сложнее, пришлось бы писать свой класс коллекции. Но благодаря разделению этих интерфейсов, мы можем гибко комбинировать. blog.shamanland.com/2016/03/composite-iterator-ru.html

8 мар 2016 в 14:32

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Можно было бы об этом задуматься, если предполагаемое соответствие Iterable и его Iterator было «один к одному». Но дело обстоит иначе: Iterable может в некий момент обходиться несколькими Iterator сразу (возможно, ещё и в разных thread’ах!). То есть, это интерфейсы, представляющие две разных сущности: коллекцию и обход коллекции.

Уже поэтому стоит их разделить, поскольку в противном случае для нескольких параллельных обходов коллекция должна быть всегда завёрнута в итератор и иметь два вида копирования (для итератора и для коллекции), а тут уже просматривается явное нарушение SRP (Single Responsibility Principle, принципа единственной обязанности).

Отслеживать
ответ дан 8 фев 2016 в 6:37
user181100 user181100

Один — тот кто ездит. Это Iterator
Другой — тот на ком ездят. Это Iterable

Первый не возможен без Второго. Второй возможен без первого, но бесполезен.

А на самом деле Iterable — всего лишь способ задать стандартный механизм извлечения итератора. Он не является таким уж важным в деле итерации. Он не нужен совсем.
Например у List есть ещё listIterator, к которому Iterable вообще никакого отношения не имеет. но тем не менее это настоящий итератор и даже упруженный дополнительными возможностями.

Отслеживать
ответ дан 8 июн 2017 в 0:20
6,290 1 1 золотой знак 11 11 серебряных знаков 18 18 бронзовых знаков

. все это отлично смотрелось бы в одном интерфейсе

Не смотрелось бы.

Iterator — это интерфейс. То есть мы можем вызвать метод какого-то класса, передать ему итератор и как бы сказать: «вот тебе некая последовательность, пробегись-ка по ней и сделай ряд действий».

Благодаря абстрактности итератор может быть вообще не привязан ни к какой коллекции, а самостоятельно генерировать значения на лету!

Причём эти действия, связанные с последовательным проходом по элементам, одинаковы для любого типа контейнера.

Но даже если считать, что любой итератор завязан на своём контейнере, то всё равно получается нехорошо. Итератор — это вспомогательная сущность, состояние которой надо хранить. Плюс, как правильно заметил @D-side, итератор даже уровне восприятия является отдельной сущностью.

Iterable vs Iterator in Java

Iterable and Iterator are both interfaces in Java that sound alike and are often confusing to Java developers. Let’s start by defining the word “iteration”.

From Merriam-Webster dictionary, an iteration is the repetition of a sequence of computer instructions a specified number of times or until a condition is met.

Basically, you can liken an iteration to looping, where you go or run through a list of items e.g for-each loop

In java, if a class implements Iterable interface, that class gains the ability to be iterated/looped over using an iterator like for-each loop. This is done by calling the iterator() method that must be implemented by the class that implements Iterable.

For example, List interface extends Collection interface, while the Collection interface extends Iterable interface which makes it possible for a List to be iterated using for-each loop.

List integers = new ArrayList<>(Arrays.asList(1, 2, 3));

for (Integer number : integers) System.out.println(number);
>

Iterator on the other hand, manages the iteration that happens in an Iterable. it has the position or holds the current state of where the iteration is during an iteration or loop. it does this by using some inbuilt helper methods such as hasNext() and next(). An example is shown below:

IteratorInteger> numbers = Arrays.asList(1, 2, 3, 4, 5).iterator();
while (numbers.hasNext()) System.out.println(numbers.next());
>

What is the relationship between Iterable and Iterator ? The relationship between both interfaces is that they work together to iterate or loop through objects in java. In a nutshell, When you implement an Iterable, you are making that “loopable” and an Iterator helps to make it “loopable ”by providing helper methods such as hasNext() and next(). The next section shows how you can combine both Iterable and Iterator.

IMPLEMENTING A CUSTOM ITERABLE AND ITERATOR

In this section, we will create a custom iterable that implements Iterable interface and likewise a custom iterator that implements Iterator interface and finally see how both work together.

public class CustomIterableT> implements IterableT> ListT> values = new ArrayList<>();

public void add(T value) values.add(value);
>
@Override
public IteratorT> iterator() return new CustomIteratorT>(values);
>

public class CustomIteratorE> implements IteratorE>
ListE> data;
int position = 0;

public CustomIterator(ListE> data) this.data = data;
>

@Override
public boolean hasNext() return data.size() > position + 1;
>

@Override
public E next() E nextValue = this.data.get(position);
position++;
return nextValue;
>
>
>

The above code shows how you can customize an iterable. It works just like List in java which is an iterable. The code below shows how you can use CustomIterable class.

public static void main(String[] args) CustomIterableInteger> integers = new CustomIterable<>(); 
integers.add(1);
integers.add(2);
integers.add(3);
integers.add(4);
integers.add(5);

for (Integer integer : integers)
System.out.println(integer);
>

The above code prints 1,2,3,4,5 using for-each loop which implicitly makes use of an Iterator and its method (hasNext() and next()).

With CustomIterable, you can decide that you do not want next() to return the next element but rather it should return next two elements by just incrementing position by 2 (position += 2).

Разница между Iterator и Iterable в Java

В этом посте будут обсуждаться различия между Iterator а также Iterable в Java.

Оба Iterator а также Iterable — это интерфейсы в Java, которые выглядят очень похожими и часто сбивают с толку новичков, но это две разные вещи. Короче говоря, если какой-либо класс реализует Iterable интерфейс, он получает возможность перебирать объект этого класса, используя Iterator.

Теперь давайте подробно обсудим основные различия между ними:

1. Ан Iterable представляет коллекцию, которую можно обойти. Реализация Iterable Интерфейс позволяет объекту использовать цикл for-each. Он делает это, внутренне вызывая iterator() метод на объекте. Например, следующий код работает только как List интерфейс расширяет Collection интерфейс, и Collection интерфейс расширяет Iterable интерфейс.

List persons = new ArrayList <> ( Arrays . asList ( «A» , «B» , «C» ) ) ;
for ( String person : persons ) < System . out . println ( person ) ;

Обратите внимание, что мы также можем позвонить forEach() метод на итерируемом объекте, начиная с Java 8, который выполняет заданное действие для каждого элемента Iterable . Стоит отметить, что стандартная реализация forEach() также использует for-each для внутреннего использования.

С другой стороны, Iterator — это интерфейс, который позволяет нам перебирать какой-то другой объект, который является какой-то коллекцией. Чтобы перебрать Iterator , мы можем использовать hasNext() + next() методы в цикле while, как показано ниже:

Iterator ` Iterator ` = Arrays . asList ( 1 , 2 , 3 , 4 , 5 ) . iterator ( ) ;
while ( iterator . hasNext ( ) ) < System . out . println ( iterator . next ( ) ) ;

Начиная с Java 8, мы также можем легко перебирать Iterator с помощью forEachRemaining() метод.

Iterator ` Iterator ` = Arrays . asList ( 1 , 2 , 3 , 4 , 5 ) . iterator ( ) ;
iterator . forEachRemaining ( System . out :: println ) ;

Можно также использовать Iterator внутри цикла for-each путем переноса преобразование Iterator в Iterable с помощью лямбда:

for ( Integer i : ( Iterable ) ( ) -> iterator )
System . out . println ( i ) ;

2. Любой класс, реализующий Iterable интерфейс должен переопределить iterator() метод, предоставляемый Iterable интерфейс. iterator() метод возвращает Iterator , который затем можно использовать для перебора объекта этого класса.

Любой класс, реализующий Iterator интерфейс должен переопределить hasNext() а также next() методы, предоставляемые Iterator интерфейс. hasNext() метод возвращает true, если итерация содержит больше элементов, а next() метод возвращает следующий элемент в итерации.

3. Iterator экземпляр хранит состояние итерации. Это означает, что он предоставляет служебные методы для получения текущего элемента, проверки существования следующего элемента и перехода к следующему элементу, если он присутствует. Другими словами, Iterator запоминает текущую позицию в коллекции и возвращает следующий по порядку элемент, если он присутствует. Iterable , с другой стороны, не поддерживает никакого такого состояния итерации.

4. Договор на Iterable заключается в том, что он должен создать новый экземпляр Iterator каждый раз, когда iterator() метод называется. Это потому, что Iterator экземпляр поддерживает состояние итерации, и все не будет работать, как если бы реализация возвращала одно и то же Iterator дважды.

5. Для Iterable , мы можем двигаться вперед только в прямом направлении, но некоторые из Iterator субинтерфейс как ListIterator позволяет нам перемещаться вперед и назад по List .

Также, Iterable не предоставляет никакого метода для изменения своих элементов, и мы не можем изменить их с помощью цикла for-each. Но Iterator позволяет удаление элементов из базовой коллекции во время итерации с remove() метод.

Это все о различиях между Iterator и Iterable в Java.

Оценить этот пост

Средний рейтинг 4.56 /5. Подсчет голосов: 62

Голосов пока нет! Будьте первым, кто оценит этот пост.

Сожалеем, что этот пост не оказался для вас полезным!

Расскажите, как мы можем улучшить этот пост?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *