Autor Tema: ¿Cuándo debe implementarse la interface Iterable en una clase Java? CU00912C  (Leído 5942 veces)

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas noches, quería consultar este tema, primero porque por su complejidad me gustó pero a la vez me dejo dudas.

https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=589:interface-iterable-y-metodo-iterator-api-java-recorrer-colecciones-ejercicio-y-ejemplo-resuelto-cu00912c&catid=58:curso-lenguaje-programacion-java-nivel-avanzado-i&Itemid=180

La primera es, que diferencia hay entre usar el import java.util.Iterator; y invocar el metodo iterator() como haciamos siempre en el curso "java desde cero" y implementar la Interface Iterable y Iterator.
La respuesta es que permite un trato mas "personalizado" de los metodos next() hasNext()... ? es lo que se me ocurre a botepronto.


Después he observado que en el for-each interviene tambien la Interface Iterator.

Hay algun ejercicio que pueda realizar para practicar este tema ? o documentación adicional clarificadora que alguien sepa que hay por la red?

Gracias de antemano como siempre. Es un tema que me ha dejado un poco el culo torcio, no por no entenderlo sino porque es complejo de replicar y saber cuando usarlo.
« Última modificación: 06 de Mayo 2015, 21:35 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:CU00912C Interface Iterable y método Iterator (API Java).
« Respuesta #1 en: 06 de Mayo 2015, 21:34 »
Hola Lorenzo

Citar
La primera es, que diferencia hay entre usar el import java.util.Iterator; y invocar el metodo iterator() como haciamos siempre en el curso "java desde cero" y implementar la Interface Iterable y Iterator.
La respuesta es que permite un trato mas "personalizado" de los metodos next() hasNext()... ? es lo que se me ocurre a bote pronto.


El motivo por el que implementar estas interfaces es que si es una clase que has creado tú no vas a poder recorrerlas con iterator porque iterator sólo está disponibles en las clases del api Java. Entonces, ¿cómo crear colecciones definidas por nosotros como programadores y permitir que sean recorridas? Implementando estas interfaces. ¿Y si no las implementamos y hacemos el recorrido de otra manera? No estaremos siguiendo la convención de todos los programadores, y si no la seguimos nos echarán de la empresa (si es que estamos en una empresa) por malos ;)

Citar
Después he observado que en el for-each interviene tambien la Interface Iterator.


Esto no entiendo muy bien a qué te refieres ¿a qué te refieres?

Saludos

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas, entendido el tema de hacerlas Iterable porque no lo son, solo las de la libreria Java. Ok y hasta ahora solo hemos invocado a Iterator sobre ArrayList o clases ya definias.

Sobre el for-each , en ese mismo ejercicio, puse un stop y cada vez que entraba en el bucle for each se iba (o eso me pareció a mi) al hasNext() que habia creado en la otra clase que implementaba Iterator. Al menos eso me pareció igual no es asi.

P.D. aun me baila un poco el tema. Hay que asimilarlo en practica ;)
« Última modificación: 06 de Mayo 2015, 21:44 por Lorenzo31 »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Citar
Sobre el for-each , en ese mismo ejercicio, puse un stop y cada vez que entraba en el bucle for each se iba (o eso me pareció a mi) al hasNext() que habia creado en la otra clase que implementaba Iterator. Al menos eso me pareció igual no es asi.

Hola, yo no le veo relación, creo que más bien sea algo que se haya mezclado sin querer, aunque voy a  :-X por si acaso

Saludos

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Será como tu dices, un error mio al observarlo.  ::)

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Hola!

Estuve haciendo la prueba de ver qué sucedía cuando usamos el for-each para recorrer un objeto tipo ConjuntoPersonas, y es cierto lo que dice Lorenzo31.
Si corremos paso-por-paso el código Programa nos damos cuenta que al entrar en la instrucción for (del for-each) se llama al método iterator() de la clase ConjuntoPersonas.
Por lo tanto for-each utiliza el método iterator() de la clase ConjuntoPersonas, de la misma manera que si utilizáramos un iterador sobre el objeto ConjuntoPersonas y luego llamáramos a sus métodos hasNext() y Next().

Es decir, que la utilización de los métodos declarados en la clase concreta MiIteratorPersona (que son los métodos que estamos obligados a implementar de la interface Iterator) son utilizados de la misma manera tanto al hacer en nuestro código Programa:

Código: [Seleccionar]
Iterator<Persona> it1 = cp.iterator();

        while (it1.hasNext()){

            Persona tmp = it1.next();

            System.out.println("La persona:"+tmp.dni+" tiene una edad de:"+tmp.edad);

        }

como si hiciéramos :

Código: [Seleccionar]
for (Persona p : cp) // Esto es un for extendido o for-each{
            System.out.println("La persona:"+p.dni+" tiene una edad de:"+p.edad);
        }

Es como si  (y por favor que se tome bien el entrecomillado) "el for-each fuese una máscara del iterador", ambas cosas funcionalmente hacen lo mismo.

Otro dato importante que va en el mismo sentido: no podríamos usar for-each para un objeto tipo ConjuntoPersonas si ConjuntoPersonas no implementara la interfaz Iterable.
Una forma simple de hacer saltar esto sería: haciendo un cambio en una línea de la clase ConjuntoPersonas:

Código: [Seleccionar]
public class ConjuntoPersonas implements Iterable<Persona>{

por:

Código: [Seleccionar]
public class ConjuntoPersonas {

(y si ningún otro cambio más en el código). Al compilar la clase Persona nos da un error de compilación en el for-each con la siguiente leyenda:

for-each not applicable to expression type
  required: array or java.lang.Iterable; found: ConjuntoPersonas

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas, así que lo que observé no era cosa mia, jeje

Bueno no le di mayor importancia, porque creo que no es una copia, es un "iterador" en el sentido de la forma en la que se mueve, hasNext y next todo el rato, pero no por ello es una copia, de echo, si eliminas algun objeto que tenga vinculos con otros, salta error por corromperlos.  Creo que simplemente tiene que ver con el funcionamiento que te comento, pero alguien que sepa más puede indicarlo mejor es una sensación logica :)

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".