Cómo utilizar un Iterador de filtrado para optimizar el procesamiento de objetos en Java

Usando una clase de Iterador de filtrado, puedes evitar la necesidad de consumir el contenido de un Iterador para producir otro Iterador que contenga un subconjunto de los objetos del Iterador original. Por ejemplo, si tienes un Iterador lleno de objetos y valores nulos, y solo quieres los objetos no nulos, un Iterador de filtrado puede agilizar el proceso con un mínimo de tiempo y memoria desperdiciados.

Índice de Contenido
  1. Iteradores: una gran alternativa a los arrays y las listas enlazadas
    1. Cómo funciona el Iterador de filtrado
  2. Componentes esenciales del Iterador de filtrado
  3. Implementación del filtro en el Iterador de filtrado
  4. Uso del Iterador de filtrado
  5. La forma incorrecta

Iteradores: una gran alternativa a los arrays y las listas enlazadas

Los objetos Iterador proporcionan un mecanismo eficiente para representar una secuencia de objetos, ya que no almacenan objetos de la misma forma que los arrays ni almacenan referencias a objetos como lo hacen las listas enlazadas. En su lugar, simplemente proporcionan métodos que permiten acceder a los objetos proporcionados por una fuente de objetos separada. Esto reduce la memoria que requieren al evitar el costoso almacenamiento de objetos duplicados. Además, pasar objetos Iterador como parámetros de función puede ser más rápido que pasar un objeto Lista clonado, ya que las copias contenidas en el Iterador no se crean hasta que el método receptor decida consumir por completo el Iterador.

Cómo funciona el Iterador de filtrado

El Listado A contiene el código fuente de una clase de Iterador de filtrado. Este Iterador de filtrado toma los objetos encontrados en un Iterador de origen y los filtra a través de una prueba simple proporcionada en el momento de la instanciación del objeto. Los objetos que pasan la prueba están disponibles a través de los métodos de la interfaz del Iterador de filtrado. Veamos más de cerca el Listado A para ver cómo funciona el Iterador de filtrado.

Componentes esenciales del Iterador de filtrado

El Iterador de filtrado implementa la interfaz `java.util.Iterator` y, por lo tanto, debe proporcionar implementaciones para los métodos definidos en esta interfaz. En consecuencia, los métodos `remove`, `hasNext` y `next` están presentes en la clase FilteringIterator. El método `remove` simplemente lanza la excepción `UnsupportedOperationException` cuando se invoca, ya que generalmente no es útil en el caso de un Iterador de filtrado.

El método `hasNext` maneja la aplicación del filtro. Dentro de este método, un bucle `while` itera a través del Iterador de origen proporcionado hasta encontrar un objeto que pase la prueba del filtro o hasta que se alcance el final del Iterador de origen. Si se encuentra un objeto que pasa la prueba, se almacena una referencia a él en el campo `next` y se devuelve `true`. Si se alcanza el final del Iterador de origen, el campo `next` se deja como `null` y se devuelve `false`.

El método `next` llama al método `hasNext` para ver si hay más objetos que cumplan los requisitos impuestos por el filtro. Cuando no hay más objetos que pasen la prueba del Iterador de filtrado, el método `next` lanza una excepción `NoSuchElementException`, de acuerdo a los requisitos de la interfaz `java.util.Iterator`. Si `hasNext` devuelve `true`, el campo `next` se establece como `null` y se devuelve su valor anterior.

Dos consejos útiles para trabajar con gráficos en Java: AWT y MIME types

Cabe destacar que no se realiza ninguna sincronización en esta clase. Al igual que las clases de colecciones de Java, generalmente es mejor dejar la sincronización al código que instancia y utiliza tus clases de utilidad. Por lo tanto, si deseas acceder a una instancia de Iterador de filtrado desde múltiples hilos, deberás crear tus propios métodos de envoltura sincronizados.

Implementación del filtro en el Iterador de filtrado

En el Listado A no se muestra la implementación del filtro que se aplica en el método `hasNext`. En su lugar, encontrarás un método abstracto llamado `accept`, que recibe un objeto y devuelve un valor booleano. Desde su uso en `hasNext`, puedes ver que cuando `accept` devuelve `true`, el objeto proporcionado pasa el filtro y es producido por el Iterador de filtrado. Cuando `accept` devuelve `false`, el objeto se omite de la secuencia de objetos.

Uso del Iterador de filtrado

Proporcionar una implementación para el método `accept` es fácil de hacer en el momento de la instanciación a través del uso de una clase interna anónima. El Listado `B` muestra un ejemplo de uso para la clase FilteringIterator. Observa cómo se proporciona el cuerpo del método `accept` al mismo tiempo que se crea la instancia del objeto. Las clases internas anónimas tienen acceso a cualquier campo de la clase contenedora, incluidos los campos privados, y a todas las variables locales finales y parámetros de método de la clase contenedora.

En el Listado B, puedes ver cómo el Iterador de filtrado evita que los valores nulos producidos por el Iterador de origen pasen al Iterador devuelto. Este filtrado se realiza sobre la marcha, sin almacenar nunca todo el contenido del Iterador de origen en memoria en un momento dado.

La forma incorrecta

Contrastemos la solución del Iterador de filtrado con la del Listado C. Allí, el Iterador de origen se consume por completo en el proceso de filtrado. Esto no solo ocupa memoria innecesariamente en el caso de un Iterador grande, sino que también puede convertirse en una pesadilla de entrada/salida (E/S). Si el Iterador de origen es un ObjectInputStream que crea objetos a partir de datos extraídos a través de la red, el filtro en el Listado C tendrá que esperar hasta que se hayan extraído y decodificado toda la serie de objetos a nivel local antes de que se pueda proporcionar un Iterador filtrado. En cambio, el Iterador de filtrado puede devolver un Iterador incluso antes de que se haya extraído y decodificado el primer objeto a través de la red.

La clase FilteringIterator, junto con la clase BufferedIterator, pueden trabajar juntas para hacer que el flujo de datos en tu aplicación sea más basado en transmisiones. Esto, a su vez, da como resultado aplicaciones que utilizan menos memoria y desperdician menos tiempo durante las operaciones de E/S.

Cómo crear y mantener un sitio web fácilmente para tu pequeña empresa con EzySite

En Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Desarrollo, allí encontraras muchos artículos similares a Cómo utilizar un Iterador de filtrado para optimizar el procesamiento de objetos en Java , tenemos lo ultimo en tecnología 2023.

Artículos Relacionados

Subir

Utilizamos cookies para mejorar su experiencia de navegación, mostrarle anuncios o contenidos personalizados y analizar nuestro tráfico. Al hacer clic en “Aceptar todo” usted da su consentimiento a nuestro uso de las cookies.