Iterator – Patrones de Diseño
Antonio Leiva

El patrón de diseño Iterator es un patrón de diseño comúnmente utilizado en el desarrollo de software. Este patrón permite recorrer una colección de elementos de manera secuencial sin conocer su implementación interna.

Implementación de Iterator: Opción 1

En Kotlin, podemos implementar el patrón de diseño Iterator utilizando la interfaz Iterator<T> y la clase Iterable<T>. La interfaz Iterator<T> tiene dos métodos principales: hasNext() y next().

El método hasNext() devuelve verdadero si hay más elementos en la colección para recorrer, mientras que el método next() devuelve el siguiente elemento en la colección.

Por ejemplo, supongamos que tenemos una clase que representa una lista de números enteros. Podemos implementar la interfaz Iterator<Int> en esta clase para permitir el recorrido de los elementos de la lista de manera secuencial:

class IntList : Iterable<Int> {
    private val numbers = mutableListOf(1, 2, 3, 4, 5)

    override fun iterator(): Iterator<Int> {
        return object : Iterator<Int> {
            private var currentIndex = 0

            override fun hasNext(): Boolean {
                return currentIndex < numbers.size
            }

            override fun next(): Int {
                return numbers[currentIndex++]
            }
        }
    }
}

Ahora, podemos utilizar la clase IntList para recorrer sus elementos utilizando un ciclo for-in:

val list = IntList()
for (number in list) {
    println(number)
}

El código anterior imprimirá cada uno de los elementos de la lista de números enteros en consola.

Implementación de Iterator: Opción 2

Otra forma de utilizar el patrón de diseño Iterator en Kotlin es implementando la interfaz Iterable<T> en la clase que representa nuestra colección de elementos.

Esta interfaz tiene un único método: iterator(). Este método debe devolver un objeto que implemente la interfaz Iterator<T>.

Por ejemplo, podemos modificar nuestra clase IntList para implementar la interfaz Iterable<Int> en lugar de crear un objeto que implemente Iterator<Int> dentro de su método iterator():

class IntList : Iterable<Int> {
    private val numbers = mutableListOf(1, 2, 3, 4, 5)

    override fun iterator(): Iterator<Int> {
        return IntListIterator(numbers)
    }
}

class IntListIterator(private val numbers: List<Int>) : Iterator<Int> {
    private var currentIndex = 0

    override fun hasNext(): Boolean {
        return currentIndex < numbers.size
    }

    override fun next(): Int {
        return numbers[currentIndex++]
    }
}

Ahora, podemos utilizar nuestra clase IntList para recorrer sus elementos utilizando un ciclo for-in:

val list = IntList()
for (number in list) {
    println(number)
}

El código anterior imprimirá cada uno de los elementos de la lista de números enteros en consola.

Conclusión

En resumen, el patrón de diseño Iterator nos permite recorrer una colección de elementos de manera secuencial sin conocer su implementación interna.

En Kotlin, podemos implementar este patrón utilizando la interfaz Iterator<T> y la clase Iterable<T>.

Estas interfaces nos permiten crear clases que pueden ser recorridas utilizando un ciclo for-in, lo que nos ahorra tener que escribir código para recorrer la colección manualmente.

Quizá también te interese…

Las reglas FIRST de los tests

Las reglas FIRST de los tests

Las reglas FIRST son un conjunto de principios que se utilizan para diseñar y escribir tests de software de manera efectiva. Las siglas FIRST significan: F - Fast: Un test debe ser rápido de ejecutar. I - Independent: Un test debe ser independiente de otros tests y...

¿Qué son los dobles de test?

¿Qué son los dobles de test?

Los dobles de prueba (también conocidos como "doubles" o "fakes") son herramientas comunes en la programación y en particular en el testing de software. Se utilizan para simular el comportamiento de una dependencia de una aplicación en un entorno de pruebas, sin tener...

Kata del TicTacToe en Kotlin

Kata del TicTacToe en Kotlin

Escribe el código para representar una entidad que almacene el tablero de juego del 3 en raya, y que además tenga: Un método move() con 2 parámetros, fila y columna, que permita añadir un movimiento al tablero Un método findWinner(), que devuelva el ganador (X, Y o...

0 comentarios

Enviar un comentario

Los datos personales que proporciones a través de este formulario quedarán registrados en un fichero de DevExpert, S.L.U., con el fin de gestionar los comentarios que realizas en este blog. La legitimación se realiza a través del consentimiento de la parte interesada. Si no se acepta, no podrás comentar en este blog. Los datos que proporciona solo se utilizan para evitar el correo no deseado y no se usarán para nada más. Puede ejercer los derechos de acceso, rectificación, cancelación y oposición en contacto@devexperto.com.

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acepto la política de privacidad *