Soy nuevo en Java y estoy realmente confundido con iterador e iterable. ¿Alguien puede explicarme y dar algunos ejemplos?¿Cuál es la diferencia entre iterador e iterable y cómo usarlos?
Respuesta
Una Iterable
es una representación simple de una serie de elementos que pueden repetirse. No tiene ningún estado de iteración, como un "elemento actual". En cambio, tiene un método que produce un Iterator
.
Un Iterator
es el objeto con estado de iteración. Le permite verificar si tiene más elementos usando hasNext()
y pasar al siguiente elemento (si corresponde) usando next()
.
Por lo general, un Iterable
debe ser capaz de producir cualquier número de Iterator
s válido.
Si una colección es iterable, se puede iterar utilizando un iterador (y consecuentemente se puede usar en a para cada ciclo). El iterador es el objeto real que iterará a través de la colección.
Una implementación de Iterable
es uno que proporciona una Iterator
de sí mismo:
public interface Iterable<T>
{
Iterator<T> iterator();
}
Un iterador es una manera sencilla de permitir que algunos de bucle a través de una colección de datos sin privilegios de asignación (aunque con capacidad de eliminar) .
public interface Iterator<E>
{
boolean hasNext();
E next();
void remove();
}
Ver Javadoc.
Implementación de la interfaz Iterable permite que un objeto sea el objetivo de la instrucció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 una implementación para iterar sobre los elementos. Iterable es una interfaz que proporciona Iterator.
Si alguna clase está implementando Iterable, debería tener un método Iterator() ¿correcto? Corrígeme si estoy equivocado. –
sí. Debería tener el método no implementado de la interfaz. En este caso, es iterador. –
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 creo que está bien, pero no responde a la pregunta de POR QUÉ usaría una sobre la otra. – EricGreg
La consideración más importante es si el elemento en cuestión debe poder atravesar más de una vez. Esto se debe a que siempre puede rebobinar un Iterable al invocar iterator() nuevamente, pero no hay forma de rebobinar un Iterator.
Iterable: Una clase que se puede repetir. Es decir, uno que tiene la noción de "conseguirme lo primero, ahora lo siguiente, y así sucesivamente, hasta que se nos acabe".
iterador: Una clase que gestiona la iteración sobre un iterable. Es decir, realiza un seguimiento de dónde estamos en la iteración actual y sabe cuál es el siguiente elemento y cómo obtenerlo.
Para hacer un objeto iterable necesita emitir un objeto Iterator
. Para hacer cumplir este contrato, se debe usar la interfaz Iterable. Contiene un método llamado iterator() y devuelve Iterator. Por lo tanto, cualquier clase que implemente Iterable devolverá un iterador.
public interface Collection<E> extends Iterable<E> {}
Por ejemplo, tomar cualquier colección. Una Colección es una interfaz que representa contenedor para series de elementos. Todas las colecciones como ArrayList, Vector implementa Collection y así Iterator.
Una de las ventajas de Iterable es que, cuando implementa Iterable, el objeto obtiene soporte para: cada sintaxis de bucle.
Supongo que 'Iterable' y' Iterator' son 'interface', no' clase'. – Ravi
Pregunta: ¿Diferencia entre Iterable y Iterador?
Respuesta:
iterable: Se relaciona con el bucle foreach
iterador: Se está relacionado con la Colección
El elemento de destino del bucle forEach shouble ser iterable.
Podemos usar Iterator para obtener el objeto uno por uno de la colección
Iterable presente en el paquete java.lang
iterador presente en el paquete java.util
Contiene sólo un método iterador()
Contiene tres método hasNext(), next(), eliminar()
Introducido en 1,5 versión
introducido en la versión 1.2
Además de ColinD y Seeker respuestas.
En términos simples, Iterable y iterador son ambas interfaces proporcionadas en el marco de recopilación de Java.
Iterable
Una clase tiene que implementar la interfaz Iterable si se quiere tener una para cada-bucle para iterar sobre su colección. Sin embargo, el bucle for-each solo se puede usar para recorrer la colección en la dirección de avance y no podrá modificar los elementos de esta colección. Pero, si todo lo que quiere 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, la obtención y la eliminación de sus elementos. Cada una de las clases de recopilación proporciona un iterador() método que devuelve un iterador al comienzo 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, acceder 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:
hablando Básicamente, ambos están muy estrechamente relacionados entre sí.
Considere iterador a ser una interfaz que nos ayuda a atravesar a través de una colección con la ayuda de algunos métodos no definidos como hasNext(), next() y remove()
Por otro lado, Iterable es otra interfaz que, si es implementada por una clase, fuerza a la clase a ser Iterable y es un objetivo para construcciones For-Each. Tiene solo un método llamado iterator() que proviene de la propia interfaz de Iterator.
Cuando una colección es iterable, se puede iterar utilizando un iterador.
Para comprender visitar estos:
Iterable:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Iterable.java
ITERATORhttp://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Iterator.java
Consideremos un ejemplo que tiene 10 manzanas. Cuando implementa Iterable, es como poner cada manzana en cuadros de 1 a 10 y devolver un iterador que se puede usar para navegar.
Mediante la implementación de iterador, podemos conseguir cualquier manzana, manzana en próximos cajas etc.
Así ejecución iterables da un iterador para navegar sus elementos Aunque para navegar, es necesario implementar iterador ..
Como explicó here, se introdujo el "Iterable" para poder usar en el lazo foreach
. Se puede repetir una clase implementando la interfaz Iterable.
iterador es la clase que gestiona la iteración sobre 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.
voy a responder a la pregunta sobre todo acerca de ArrayList como un ejemplo con el fin de ayudar a entender mejor ..
- interfaz Iterable obliga a sus subclases para implementar el método abstracto 'iterador()'.
public interface Iterable { ... abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T. ... }
-
interfaz Iterator
- obliga a sus subclases para 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. ... }
- ArrayList implementa Lista, Lista implementa Recogida y Collection implementa Iterable .. Es decir, se podía ver la relación como
'Iterable < - Colección < - Lista < - ArrayList'
. Y Iterable, Collection y List solo declaran el método abstracto 'iterator()' y ArrayList solo lo implementa.
- 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.
'iterator()' método 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]; } ... } }
- Algunos otros métodos o clases se iterar elementos de colecciones como ArrayList través de la utilización 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, es claro? :)
¡Sí! ¡Muy claro! –
- 1. ¿Cómo saber la diferencia entre un iterador y un iterable?
- 2. ¿Cuál es la relación entre Iterable e Iterator?
- 3. ¿Cuál es la diferencia entre PHP require e include?
- 4. en Java ¿cuál es la diferencia entre, E, T
- 5. ¿Cuál es la diferencia entre ObservableCollection e INotifyPropertyChanged?
- 6. Cuál es la diferencia entre IQueryable e IEnumerable
- 7. Localización e internacionalización, ¿cuál es la diferencia?
- 8. ¿cuál es la diferencia entre invalidateList e invalidateDisplayList?
- 9. ¿Cuál es la diferencia entre WAS e IIS?
- 10. ¿Cuál es la diferencia entre int [] [] e int [,]?
- 11. ¿Cuál es la diferencia entre la sed -e y sed -e
- 12. ¿Cuál es la diferencia entre Tarea e hilo?
- 13. ¿Cuál es la diferencia entre import java.util. *; e importar java.util.Date; ?
- 14. ¿Cuál es la diferencia entre una clave principal e identidad?
- 15. ¿Cuál es la diferencia entre require e include con php?
- 16. ¿Cuál es la diferencia entre IEnumerator e IEnumerable?
- 17. ¿cuál es la diferencia entre IVT e IDT?
- 18. ¿Cuál es la diferencia entre "protegido" e "interno protegido"?
- 19. ¿Cuál es la diferencia entre size_t e int en C++?
- 20. Cuál es la diferencia entre DetachedCriteria e ICriteria
- 21. Cuál es la diferencia entre __construct() e init()
- 22. ¿Cuál es la diferencia entre "privado" e "interno protegido"?
- 23. ¿Cuál es la diferencia entre "indefinido" e indefinido?
- 24. ¿Cuál es la diferencia entre objeto e instancia?
- 25. ¿Cuál es la diferencia entre NHibernate e iBATIS.NET?
- 26. ¿Cuál es la diferencia entre Scope_Identity(), Identity(), @@ Identity e Ident_Current()?
- 27. ¿Cuál es la diferencia entre IDelegateEvent e IEvent en F #?
- 28. ¿Cuál es la diferencia entre IDREF e IDREFS en XSD?
- 29. ¿Cuál es la diferencia entre identidad e igualdad en OOP?
- 30. ¿Cuál es la diferencia entre las interfaces IComparable e IEquatable?
¿Importa eso si' Iterable' tiene iterador 'interal' o' external' o es posible tener alguno de ellos? – sakhunzai