¿Cuál es la diferencia entre iterador e iterable y cómo usarlos?


195

Soy nuevo en Java y estoy realmente confundido con iterador e iterable. ¿Alguien puede explicarme y dar algunos ejemplos?

Respuestas:


200

Una Iterablees una representación simple de una serie de elementos que se pueden iterar. No tiene ningún estado de iteración, como un "elemento actual". En cambio, tiene un método que produce unIterator .

An Iteratores el objeto con estado de iteración. Le permite verificar si tiene más elementos usando hasNext()y pasar al siguiente elemento (si lo hay) usando next().

Típicamente, un Iterabledebería ser capaz de producir cualquier número de Iterators válidos .


¿eso importará si Iterabletiene interalo externaliterador o es posible tener alguno de ellos?
sakhunzai

90

Una implementación de Iterablees aquella que proporciona una Iteratorde sí misma:

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

Un iterador es una forma simple de permitir que algunos recorran una colección de datos sin privilegios de asignación (aunque con la capacidad de eliminarlos).

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

Ver Javadoc .


16

Contestaré la pregunta especialmente sobre ArrayList como ejemplo para ayudarlo a comprender mejor.

  1. La interfaz iterable obliga a sus subclases a implementar el método abstracto 'iterator ()'.
public interface Iterable {
  ...
  abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T.
  ...
}
  1. La interfaz del iterador obliga a sus subclases a implementar el método abstracto 'hasNext ()' y '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 implementa Lista, Lista extiende Colección y Colección extiende Iterable. Es decir, podría ver la relación como

    'Iterable <- Colección <- Lista <- ArrayList'

. E Iterable, Collection y List simplemente declaran el método abstracto 'iterator ()' y ArrayList solo lo implementa.

  1. Voy a mostrar el código fuente de ArrayList con el método 'iterator ()' de la siguiente manera para obtener información más detallada.

El método 'iterator ()' devuelve un objeto de la clase 'Itr' que implementa '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. Algunos otros métodos o clases iterarán elementos de colecciones como ArrayList haciendo uso de Iterator (Itr).

Aquí hay un ejemplo simple.

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);
    }
}

Ahora, ¿está claro? :)


Gran respuesta .!
Kavindu Dodanduwa

Entendí esta publicación, pero ¿ Iterable<T>qué sucede si quiero escribir un método cuyo tipo de retorno es entonces en este escenario, qué pasos debemos implementar? Por favor sugiera ese ejemplo también.
Prasanna Sasne

12

Si una colección es iterable, se puede iterar usando un iterador (y, en consecuencia, se puede usar en un para cada ciclo). El iterador es el objeto real que iterará a través de la colección.


2
FYI a java.util.Collection siempre implementa java.util.Iterable.
Paul Draper

2
¿No es así java.lang.Iterable?
ulab

Esjava.lang.Iterable
aldok

9

La implementación de la interfaz Iterable permite que un objeto sea el objetivo de la declaración "foreach".

class SomeClass implements Iterable<String> {}

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

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

Iterator es una interfaz, que tiene implementación para iterar sobre elementos. Iterable es una interfaz que proporciona Iterator.


1
Si alguna clase está implementando Iterable, ¿debería tener un método Iterator () correcto? Corrígeme si estoy equivocado.
Chinmaya B

si. Debería tener el método no implementado de la interfaz. En este caso es Iterator.
agent.smith

Gracias por una respuesta inteligente. Vine aquí para verificar mi comprensión de Iterable vs Iterator. Lo confirmaste. Todas las otras respuestas hablan sobre la estructura, lo que supongo que está bien, pero no responde la pregunta de POR QUÉ usaría una sobre la otra.
EricGreg

Para mí, esta es la mejor respuesta.
Sam

Quería saber cuál es el beneficio de Para cada bucle de String s: someClass. Dado que someClass es un objeto de clase java y s String ref. Bajo qué circunstancias uno debería ir con este tipo de implementaciones.
Neeraj

8

La consideración más importante es si el artículo en cuestión debería poder atravesarse más de una vez. Esto se debe a que siempre puede rebobinar un Iterable llamando nuevamente a iterator (), pero no hay forma de rebobinar un Iterator.


Me preguntaba por qué las clases de colección no implementan la interfaz Iterator directamente (en lugar de implementar Iterable y devolver el objeto Iterator). Esta respuesta dejó en claro que, en ese caso, no habría sido posible atravesar la colección varias veces (y también simultáneamente por múltiples hilos). Esta es una respuesta muy importante.
simpleDev

2

Como se explica aquí , se introdujo el " Iterable " para poder usarlo en el foreachbucle. Una clase implementando el interfaz Iterable puede repetirse.

Iterator es una clase que gestiona la iteración sobre un Iterable . Mantiene un estado de dónde estamos en la iteración actual, y sabe cuál es el siguiente elemento y cómo obtenerlo.


2

Considere un ejemplo con 10 manzanas. Cuando implementa Iterable, es como poner cada manzana en cuadros del 1 al 10 y devolver un iterador que se puede usar para navegar.

Al implementar el iterador, podemos obtener cualquier manzana, manzana en los siguientes cuadros, etc.

Entonces, la implementación iterable le da a un iterador para navegar sus elementos, aunque para navegar, el iterador necesita ser implementado.


1

Pregunta: ¿Diferencia entre Iterable e Iterator?
Respuesta:

iterable: está relacionado con cada
iterador de bucle : está relacionado con la colección

El elemento de destino del ciclo forEach debe ser iterable.
Podemos usar Iterator para obtener el objeto uno por uno de la Colección

Iterable presente en el paquete java. packageang Iterator
presente en el paquete java.util

Contiene solo un iterador de método ()
Contiene tres métodos hasNext (), next (), remove ()

Introducido en la versión 1.5
Introducido en la versión 1.2


1

Básicamente hablando, ambos están muy relacionados entre sí.

Considere Iterator como una interfaz que nos ayuda a atravesar una colección con la ayuda de algunos métodos indefinidos como hasNext (), next () y remove ()

Por otro lado, Iterable es otra interfaz que, si es implementada por una clase, obliga a la clase a ser Iterable y es un objetivo para la construcción For-Each. Tiene solo un método llamado iterator () que proviene de la interfaz Iterator.

Cuando una colección es iterable, puede iterarse usando un iterador.

Para entender, visite estos:

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

Sé que esta es una vieja pregunta, pero para cualquiera que lea esto y que esté atrapado en la misma pregunta y que pueda verse abrumado con toda la terminología, aquí hay una analogía buena y simple para ayudarlo a comprender esta distinción entre iterables e iteradores:

Piensa en una biblioteca pública. Vieja escuela. Con libros de papel. Sí, ese tipo de biblioteca.

Un estante lleno de libros sería como un iterable. Puedes ver la larga fila de libros en el estante. Puede que no sepa cuántos, pero puede ver que es una larga colección de libros.

El bibliotecario sería como el iterador. Puede señalar un libro específico en cualquier momento. Puede insertar / eliminar / modificar / leer el libro en el lugar donde está apuntando. Señala, en secuencia, cada libro a la vez cada vez que gritas "¡siguiente!" a él. Entonces, normalmente le preguntarías: "¿Siguiente?", Y él dirá "sí", a lo que tú dirás "¡siguiente!" y él señalará el próximo libro. También sabe cuándo ha llegado al final del estante, de modo que cuando pregunta: "¿Siguiente?" él dirá "no".

Sé que es un poco tonto, pero espero que esto ayude.


0

Además de las respuestas ColinD y Seeker .

En términos simples, Iterable e Iterator son interfaces proporcionadas en Java Framework Collection.

Iterable

Una clase tiene que implementar la interfaz Iterable si quiere tener un ciclo for-each para iterar sobre su colección. Sin embargo, el ciclo for-each solo se puede usar para recorrer la colección en la dirección hacia adelante y no podrá modificar los elementos de esta colección . Pero, si todo lo que desea es leer los datos de los elementos, entonces es muy simple y, gracias a la expresión lambda de Java, a menudo es un trazador de líneas. Por ejemplo:

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

Iterador

Esta interfaz le permite iterar sobre una colección, obtener y eliminar sus elementos. Cada una de las clases de colección proporciona un método iterator () que devuelve un iterador al inicio de la colección. La ventaja de esta interfaz sobre iterable es que con esta interfaz puede agregar, modificar o eliminar elementos en una colección . Pero, el acceso a los elementos necesita un poco más de código que iterable. Por ejemplo:

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

Fuentes:

  1. Java Doc Iterable
  2. Java Doc Iterator

0

Iterable se introdujeron para usar en cada bucle en java

public interface Collection<E> extends Iterable<E>  

Iteratores una clase que gestiona la iteración sobre un Iterable. Mantiene un estado de dónde estamos en la iteración actual, y sabe cuál es el siguiente elemento y cómo obtenerlo.


Bienvenido a SO, siempre puedes hacer el recorrido aquí , para que tu respuesta sea más útil y limpia. En nuestro caso, la pregunta es pedir una explicación sobre las dos clases, pero su respuesta es bastante confusa en lugar de aclarar las cosas. También trate de mantener una referencia, mientras publica fragmentos de fuentes conocidas / válidas / certificadas, para que su respuesta sea más concreta.
AntJavaDev
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.