¿Qué es un iterador externo e interno en Java?Iterador externo frente a iterador interno
Respuesta
Se trata de quién controls the iteration.
Otros detalles se encuentran en esta pregunta What are the benefits of the Iterator interface in Java?
encontré este description:
externos frente a los iteradores internos.
Iteradores externos: cuando la iteración está controlada por el objeto de colección decimos que tenemos un iterador externo.
En idiomas como .net o Java, es muy fácil crear iteradores externos. En nuestra implementación clásica, se implementa un iterador externo. En el siguiente ejemplo se utiliza un repetidor externo:
// using iterators for a clloection of String objects:
// using in a for loop
for (Iterator it = options.iterator(); it.hasNext();) {
String name = (String)it.next();
System.out.println(name);
}
// using in while loop
Iterator name = options.iterator();
while (name.hasNext()){
System.out.println(name.next());
}
// using in a for-each loop (syntax available from java 1.5 and above)
for (Object item : options)
System.out.println(((String)item));
iteradores internos - Cuando el iterador controla tenemos un iterador interno
Por otro lado la implementación y uso de iteradores internos es realmente difícil. Cuando se usa un iterador interno, significa que el código que se ejecutará se delega al objeto agregado. Por ejemplo, en idiomas que ofrecen soporte para esto es fácil llamar a los iteradores internos:
collection do: [:each | each doSomething] (Smalltalk)
La idea principal es pasar el código a ser ejecutado a la colección. Luego, la colección llamará internamente el método doSomething en cada uno de los componentes. En C++, es posible enviar el método doMethod como un puntero. En C#, .NET o VB.NET, es posible enviar el método como delegado. En java, se debe usar el patrón de diseño Functor
. La idea principal es crear una interfaz base con solo un método (doSomething). Luego, el método se implementará en una clase que implemente la interfaz y la clase se pasará a la colección para iterar. Para obtener más detalles, consulte el patrón de diseño Functor
.
iterador externo
Cuando se obtiene un iterador y pasar por encima de ella, que es un iterador externa
for (Iterator iter = var.iterator(); iter.hasNext();) {
Object obj = iter.next();
// Operate on obj
}
interna iterador
Cuando se pasa un objeto de función a un método para ejecutar más de una lista, que es un iterador interno
var.each(new Functor() {
public void operate(Object arg) {
arg *= 2;
}
});
- 1. iterador frente a referencia frente a puntero
- 2. Convertir iterador a int
- 3. Rendimiento del bucle tradicional frente a iterador/foreach en Java
- 4. Cómo restringir un iterador a ser un iterador directo?
- 5. Iterador genérico
- 6. impulso :: iterador
- 7. iterador aritmética
- 8. ¿Clonar un iterador en Java?
- 9. Enumeración La conversión a iterador
- 10. ¿Diferencia de rendimiento entre el iterador ++ y el iterador ++?
- 11. Scala convertir un iterador [Opción [T]] en un iterador [T]
- 12. ¿Convertir iterador en puntero?
- 13. Cómo clonar un iterador?
- 14. de iterador de salida
- 15. C++ iterador plantilla nombretipo
- 16. Lista vs Lista iterador
- 17. C++ iterador cadena
- 18. rendimiento del iterador personalizado
- 19. omitiendo el iterador
- 20. Scala, extendiendo el iterador
- 21. ¿Cómo usar un iterador?
- 22. colección mejorada iterador
- 23. ¿El iterador admite + operador?
- 24. problemas iterador C++
- 25. Incremento aplicación operador/iterador
- 26. iterador de acoplamiento
- 27. Cuándo escribir un iterador?
- 28. bloques iterador en Clojure?
- 29. iterador perezosa de Python
- 30. iterador método siguiente
Dado que Java 5 es la forma preferida para usar un iterador externo, sería usar el bucle for-each: * for (Object o: var) {// NOOP} * aunque es meramente azúcar sintáctico para el iterador explícito que usa la versión. – Alex
@JohannZacharee no se considera bucle foreach como un iterador interno, ya que no tenemos el control sobre el iterador? – denis631
@ denis631 Sí, estoy de acuerdo en que el ciclo foreach actúa de forma similar a un iterador interno. No lo usé como mi ejemplo, ya que entiendo que Java los convierte a un iterador externo en el momento de la compilación. Elegí un ejemplo funcional para ilustrar más claramente las diferencias. –