tutorial funcional expresiones ejemplos ejemplo java data-structures iterator java-8 spliterator

funcional - stream filter java 7



¿Cuál sería un buen escenario de uso para el Spliterator en Java 8? (3)

Ejemplo de caso de uso: "Convierte iterador a transmisión"

public static <T> Stream<T> iteratorToFiniteStream(final Iterator<T> iterator) { final Iterable<T> iterable = () -> iterator; return StreamSupport.stream(iterable.spliterator(), false); }

¿Cuál sería un buen escenario de uso para la clase Spliterator en Java 8?


Normalmente, un desarrollador de aplicaciones no consume la API de Spliterator directamente. Pero si está proporcionando una API e implementando su propia clase similar a una colección, puede implementar Spliterator para adaptar su colección a la API Stream . Esto es compatible con un enfoque funcional, procesamiento paralelo y otras características.

Por ejemplo, escribí una utilidad para enumerar direcciones IP en una red, especificada por notación CIDR. No es realmente una colección; es decir, no lleva la lista de todas las direcciones en la memoria a la vez, solo el número de red y la máscara de red. Pero al exponer un Spliterator , se puede adaptar fácilmente a un Stream . (Cada Spliterator solo rastrea la dirección IP actual y la dirección máxima en su parte de la red).

Otro ejemplo del tiempo de ejecución de Java principal es DirectoryStream para atravesar el sistema de archivos.


Spliterator es una extensión de la clase de Iterator atemporal que permite dividir una secuencia de objetos para iterar (la Stream funciona mediante la recopilación de las operaciones antes de iterar).

No puedo pensar en ninguna ocasión en que el desarrollador promedio tenga que trabajar con Spliterator . Las API de Collection y Collections son increíblemente ricas en Java 8, y en la mayoría de los casos sería mejor usar una subclase de Collection vainilla en lugar de crear tu propia interfaz de Stream .

Un ejemplo de cuándo querría usar Spliterator podría ser una biblioteca para graphs usen una estructura de datos vinculada sobre la cual el Spliterator / stream() estándar no está definido.