Java Spliterator

El Iterator de Java Spliterator es uno de los cuatro iteradores – Enumeración, Iterator, ListIterator y Spliterator.

Java Spliterator

Al igual que Iterator y ListIterator, Spliterator es un iterador de Java, que se utiliza para iterar elementos uno por uno de un objeto implementado por List. Algunos puntos importantes sobre el Java Spliterator son:

  1. Java Spliterator es una interfaz en la API de Colección de Java.
  2. Spliterator se introdujo en la versión Java 8 en el paquete java.util.
  3. Soporta la funcionalidad de programación paralela.
  4. Podemos usarlo tanto para la API de Colección como para las clases de la API Stream.
  5. Proporciona características sobre los objetos de la Colección o API.
  6. NO podemos usar este Iterador para las clases implementadas por Map.
  7. Utiliza el método `tryAdvance()` para iterar elementos individualmente en múltiples Hilos para admitir el Procesamiento Paralelo.
  8. Utiliza el método `forEachRemaining()` para iterar elementos secuencialmente en un solo Hilo.
  9. Utiliza el método `trySplit()` para dividirse en Sub-Spliterators y admitir el Procesamiento Paralelo.
  10. El Spliterator admite tanto el procesamiento Secuencial como el Paralelo de datos.

El Spliterator en sí mismo no proporciona el comportamiento de programación paralela. Sin embargo, proporciona algunos métodos para admitirlo. Los desarrolladores deben utilizar los métodos de la interfaz Spliterator e implementar la programación paralela utilizando el Marco Fork/Join (un buen enfoque).

Funcionalidades Principales del Spliterator

  • División de los datos fuente.
  • Procesamiento de los datos fuente.

Diagrama de Clase de la Clase Spliterator de Java

El siguiente diagrama muestra el Diagrama de Clase de la interfaz Spliterator de Java. Tiene muchos campos y métodos.

Métodos de la Clase Spliterator de Java

En esta sección, enumeraremos todos los métodos del Java Spliterator uno por uno con una descripción útil.

  1. int characteristics(): Devuelve un conjunto de características de este Spliterator y sus elementos.
  2. long estimateSize(): Devuelve una estimación del número de elementos que encontraría un recorrido forEachRemaining(), o devuelve Long.MAX_VALUE si es infinito, desconocido o demasiado caro de calcular.
  3. default void forEachRemaining(Consumer action): Realiza la acción dada para cada elemento restante, secuencialmente en el hilo actual, hasta que se procesan todos los elementos o la acción arroja una excepción.
  4. default Comparator getComparator(): Si la fuente de este Spliterator está ORDENADA por un comparador, devuelve ese comparador.
  5. default long getExactSizeIfKnown(): Método de conveniencia que devuelve estimateSize() si este Spliterator tiene un tamaño conocido, de lo contrario, devuelve -1.
  6. default boolean hasCharacteristics(int characteristics): Devuelve true si las características() de este Spliterator contienen todas las características dadas.
  7. boolean tryAdvance(Consumer action): Si existe un elemento restante, realiza la acción dada en él, devolviendo true; de lo contrario, devuelve false.
  8. Spliterator trySplit(): Si este spliterator se puede dividir, devuelve un Spliterator que cubre elementos que, al regresar de este método, no estarán cubiertos por este Spliterator.

Ejemplo de Java Spliterator

En esta sección, discutiremos cómo crear un objeto Java Spliterator usando spliterator() y desarrollaremos un ejemplo simple.

import java.util.Spliterator;
import java.util.ArrayList;
import java.util.List;

public class SpliteratorSequentialIteration
{
  public static void main(String[] args) 
  {
	List names = new ArrayList<>();
	names.add("Rams");
	names.add("Posa");
	names.add("Chinni");
		
	// Obteniendo Spliterator
	Spliterator namesSpliterator = names.spliterator();
		
	// Recorriendo elementos
	namesSpliterator.forEachRemaining(System.out::println);			
   }
}

Salida:-

Rams
Posa
Chinni

Si observamos el programa y la salida anteriores, podemos entender fácilmente que este método Spliterator.forEachRemaining() funciona de la misma manera que foreach() de ArrayList. Sí, ambos funcionan de manera similar.

Ventajas de Spliterator

  1. A diferencia de Iterator y ListIterator, soporta la funcionalidad de Programación Paralela.
  2. A diferencia de Iterator y ListIterator, soporta tanto el Procesamiento Secuencial como el Paralelo de datos.
  3. Comparado con otros Iteradores, proporciona un mejor rendimiento.

Iterator vs Spliterator

Iterator Spliterator
Introduced in Java 1.2. Introduced in Java 1.8.
It is an Iterator for whole Collection API. It is an Iterator for both Collection and Stream API, except Map implemented classes.
It is an Universal Iterator. It is NOT an Universal Iterator.
It does NOT support Parallel Programming. It supports Parallel Programming.

Eso es todo sobre Spliterator en Java. Referencia: Documentación de la API

Source:
https://www.digitalocean.com/community/tutorials/java-spliterator