Jaka jest różnica między iteratorem a iterable i jak z nich korzystać?

Jestem nowy w Javie i jestem naprawdę mylony z iteratorem i iterable. Czy ktoś może mi wyjaśnić i podać jakieś przykłady?

Author: i_am_zero, 2011-07-28

12 answers

An {[0] } jest prostą reprezentacją szeregu elementów, które można iterować. Nie posiada żadnego stanu iteracji, takiego jak "bieżący element". Zamiast tego ma jedną metodę, która wytwarza Iterator.

An {[1] } jest obiektem ze stanem iteracji. Pozwala sprawdzić, czy ma więcej elementów za pomocą hasNext() i przejść do następnego elementu (jeśli istnieje) za pomocą next().

Zazwyczaj, Iterable powinien być w stanie wyprodukować dowolną liczbę ważnych Iterators.

 147
Author: ColinD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-28 17:41:40

Implementacja Iterable to taka, która sama w sobie dostarcza Iterator:

public interface Iterable<T>
{
    Iterator<T> iterator();
}

Iterator jest prostym sposobem pozwalającym niektórym na zapętlenie zbioru danych bez przypisania uprawnień (choć z możliwością ich usunięcia).

public interface Iterator<E>
{
    boolean hasNext();
    E next();
    void remove();
}

ZobaczJavadoc .

 71
Author: Keith Pinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-29 14:54:52

Iterable: interfejs, który można iterować. Oznacza to, że taki, który ma pojęcie " get me the first thing, now the next thing, and so on, until we run out."

Iterator: interfejs, który zarządza iteracją przez iterable. Oznacza to, że śledzi to, gdzie jesteśmy w bieżącej iteracji i wie, jaki jest następny element i jak go zdobyć.

Aby obiekt mógł być powtarzalny, musi on emitować obiekt Iterator. Aby wyegzekwować niniejszą Umowę, można interfejs ma być używany. Zawiera on metodę o nazwie iterator () i zwraca Iterator. Dlatego każda klasa implementująca Iterable zwróci Iterator.

public interface Collection<E> extends Iterable<E> {}

Na przykład weźmy dowolny zbiór. Zbiór jest interfejsem reprezentującym kontener dla szeregu elementów. Każdy zbiór jak ArrayList, Vector implementuje zbiór a więc Iterator.

Jedną z zalet Iterable jest to, że po zaimplementowaniu Iterable obiekt otrzymuje wsparcie dla składni for: each loop.

 15
Author: Seeker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-18 17:17:55

Jeśli zbiór jest iteracyjny, to może być iteracyjny za pomocą iteratora (i w konsekwencji może być użyty w for each loop.) Iterator jest faktycznym obiektem, który będzie iteracją poprzez kolekcję.

 9
Author: dlev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-28 17:39:46

Implementacja interfejsu Iterable pozwala obiektowi być celem instrukcji "foreach".

class SomeClass implements Iterable<String> {}

class Main 
{
  public void method()
  {
     SomeClass someClass = new SomeClass();
     .....

    for(String s : someClass) {
     //do something
    }
  }
}

Iterator jest interfejsem, który posiada implementację do iteracji elementów. Iterable jest interfejsem, który zapewnia Iterator.

 7
Author: Nageswaran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-07 13:30:01

Najważniejszą kwestią jest to, czy przedmiot, o którym mowa, powinien być w stanie przejść więcej niż jeden raz. Dzieje się tak dlatego, że zawsze możesz przewijać iterowalne wywołując ponownie iterator (), ale nie ma możliwości przewijania iteratora.

 4
Author: Praveen Kishor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-27 03:37:54

Odpowiem na pytanie szczególnie o ArrayList jako przykład, aby pomóc ci lepiej zrozumieć..

  1. Interfejs Iterable zmusza swoje podklasy do implementacji abstrakcyjnej metody ' iterator ()'.
public interface Iterable {
  ...
  abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T.
  ...
}
  1. Interfejs iteratora zmusza swoje podklasy do implementacji abstrakcyjnych metod 'hasNext () 'i'next ()'.
public interface Iterator {
  ...
  abstract boolean hasNext(); //Returns true if the iteration has more elements.
  abstract E next();          //Returns the next element in the iteration.
  ...
}
  1. ArrayList implementuje listę, List implementuje kolekcję i Collection implementuje Iterowalne.. To jest, można było zobaczyć związek jak

    'Iterable

. I Iterable, Collection I List po prostu deklarują abstrakcyjną metodę 'iterator ()' i ArrayList samodzielnie ją implementuje.

  1. pokażę kod źródłowy ArrayList z metodą 'iterator ()' w następujący sposób, aby uzyskać bardziej szczegółowe informacje.

Metoda' iterator () 'zwraca obiekt klasy 'Itr', który implementuje "Iterator".

public class ArrayList<E> ... implements List<E>, ...
{
  ...
  public Iterator<E> iterator() {
              return new Itr();
  }


  private class Itr implements Iterator<E> {
          ...

          public boolean hasNext() {
              return cursor != size;
          }
          @SuppressWarnings("unchecked")
          public E next() {
              checkForComodification();
              int i = cursor;
              if (i >= size)
                  throw new NoSuchElementException();
              Object[] elementData = ArrayList.this.elementData;
              if (i >= elementData.length)
                  throw new ConcurrentModificationException();
              cursor = i + 1;
              return (E) elementData[lastRet = i];
          }
          ...
  }
}
  1. niektóre inne metody lub klasy będą iteracją elementów kolekcji, takich jak ArrayList, poprzez wykorzystanie iteratora (Itr).

Oto prosty przykład.

public static void main(String[] args) {

    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    list.add("f");

    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        String string = iterator.next();
        System.out.println(string);
    }
}
Czy to jasne? :)
 3
Author: JAMES HWANG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-02 08:12:18

Mówiąc ogólnie, obie są ze sobą bardzo blisko spokrewnione.

Rozważ Iterator jako interfejs, który pomaga nam w przechodzeniu przez kolekcję za pomocą niektórych niezdefiniowanych metod, takich jak hasNext (), next() I remove()

Z drugiej strony, Iterable jest innym interfejsem, który, jeśli zostanie zaimplementowany przez klasę, wymusza, aby klasa była Iterable i jest celem dla każdej konstrukcji For. Posiada tylko jedną metodę o nazwie iterator (), która pochodzi z samego interfejsu iteratora.

Gdy zbiór jest iteracyjny, to może być iteracyjny za pomocą iteratora.

Dla zrozumienia odwiedź Te:

ITERABLE: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Iterable.java

ITERATOR http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Iterator.java

 1
Author: Doomed93,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-07 15:11:00

Rozważ przykład mający 10 jabłek. Kiedy implementuje Iterable, to jest jak umieszczenie każdego apple w polach od 1 do 10 i zwrócić iterator, który może być używany do nawigacji.

Implementując iterator możemy uzyskać dowolne jabłko, jabłko w kolejnych polach itp.

Tak więc implementacja iterable daje iteratorowi do poruszania się po jego elementach, chociaż aby nawigować, iterator musi być zaimplementowany..

 1
Author: Abhishek Malviya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-17 06:08:13

Jak wyjaśniono tutaj , wprowadzono " Iterable", aby móc korzystać z pętli foreach. Klasa implementująca interfejs Iterowalny może być iterowana.

Iterator jest klasą, która zarządza iteracją przez Iterable . Utrzymuje stan, gdzie jesteśmy w bieżącej iteracji i wie, jaki jest następny element i jak go uzyskać.

 1
Author: Sangeeta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-14 07:01:32

Pytanie: różnica między Iterable i Iterator?
Ans:

Iterable: jest związany z pętlą forEach
iterator: is jest powiązany ze zbiorem

Element docelowy pętli forEach shouble jest iterowalny.
Możemy użyć iteratora, aby uzyskać obiekt jeden po drugim z kolekcji

Iterable present in java.ḷang Pakiet
Iterator obecny w Javie.pakiet util

Zawiera tylko jedną metodę iterator ()
Zawiera trzy metody hasNext (), next(), remove ()

Wprowadzony w wersji 1.5
Wprowadzono w wersji 1.2

 0
Author: Rf Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-28 20:02:51

oprócz odpowiedzi ColinD i Seeker.

W prostych słowach, Iterablei Iterator są interfejsami dostarczanymi w Java Collection Framework.

Iterable

Klasa musi zaimplementować interfejs Iterowalny, jeśli chce mieć pętlęfor-each do iteracji nad jej kolekcją. Jednak pętla for-each może być używana tylko do przechodzenia przez zbiór w przód kierunek i nie będzie można modyfikować elementów w tej kolekcji . Ale jeśli chcesz tylko odczytać dane elements, to jest to bardzo proste i dzięki Java lambda expression jest to często jeden liner. Na przykład:

iterableElements.forEach (x -> System.out.println(x) );

Iterator

Ten interfejs umożliwia iterację kolekcji, uzyskiwanie i usuwanie jej elementów. Każda z klas kolekcji dostarcza metodę iterator () , która zwraca iterator na początek kolekcji. Zaletą tego interfejsu nad możliwością iteracji jest to, że za pomocą tego interfejsu można dodawać, modyfikować lub usuwać elementy w kolekcji. Ale dostęp do elementów wymaga trochę więcej kodu niż iterable. Na przykład:

for (Iterator i = c.iterator(); i.hasNext(); ) {
       Element e = i.next();    //Get the element
       System.out.println(e);    //access or modify the element
}

Źródła:

  1. Java Doc Iterable
  2. Java Doc Iterator
 0
Author: shahrukhamd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-31 15:05:01