Skip to main content

Iterator

Iterator encapsula la forma de recorrer una fuente de datos sin exponer su estructura interna ni forzar su carga completa en memoria.

🔑 Clave:

  • No es “recorrer una colección”
  • Es controlar el flujo de consumo de datos
  • Especialmente relevante cuando:
    • hay grandes volúmenes
    • el origen no es una colección
    • el acceso es costoso (DB, API, file, stream)

¿Se usa hoy en arquitectura hexagonal?

✅ SÍ, pero no como patrón explícito GoF

En hexagonal se usa cuando:

✔️ Hay casos de uso batch / stream

✔️ El dominio consume datos progresivamente

✔️ El origen es externo (DB, SP, API, archivo)

📌 No se suele llamar “Iterator”, pero el concepto está ahí.

¿Cómo se implementa hoy (vs GoF)?

Implementación moderna

Hoy se expresa como:

  • ResultSet
  • Stream
  • Spliterator
  • Iterable
  • Flux (reactivo)
  • Reader / Scanner
  • Kafka Consumer

👉 El patrón vive en el lenguaje y las APIs.

Anti-ejemplo típico (muy común)

List<Order> orders = repository.findAll();
orders.forEach(this::process);

❌ Carga todo

❌ No escala

❌ GC pressure

❌ Batch frágil

❌ Oculta el costo real

📌 Este código miente sobre su complejidad.

👉 Ver implementación completa en GitHub: https://github.com/MaxiCorrea/java-iterator

¿Tiene reemplazo?

❌ No tiene “reemplazo”, tiene evoluciones

Según el contexto:

ContextoAlternativa
BatchIterator / Stream
StreamingReactive Streams
EventosKafka Consumer
IOReader / Scanner
ParalelismoSpliterator

Regla de oro

Si recorrer datos puede romper memoria, el caso de uso no debe recibir una colección.

📌 Cuando hay duda → Iterator primero.

Frase final

“Iterator no es un patrón de colecciones, es un patrón de control del flujo de datos.”

Ver video

Iterator in Java