Tengo problemas para comprender la Stream
interfaz en Java 8, especialmente cuando tiene que ver con las interfaces Spliterator
y Collector
. Mi problema es que simplemente no puedo entender Spliterator
las Collector
interfaces y todavía, y como resultado, la Stream
interfaz todavía es algo oscura para mí.
¿Qué es exactamente ay Spliterator
a Collector
, y cómo puedo usarlos? Si estoy dispuesto a escribir el mío Spliterator
o Collector
(y probablemente el mío Stream
en ese proceso), ¿qué debo hacer y no hacer?
Leí algunos ejemplos dispersos por la web, pero como todo aquí es nuevo y está sujeto a cambios, los ejemplos y tutoriales aún son muy escasos.
fuente
Collectors.of
Se eliminó un método antiguo de versión beta o me falta algo? Para completar,(x,y) -> x+y
se puede escribir comoInteger::sum
.Spliterator
básicamente significa "iterador divisible".Un solo hilo puede atravesar / procesar todo el Spliterator, pero el Spliterator también tiene un método
trySplit()
que "dividirá" una sección para que otra persona (típicamente, otro hilo) procese, dejando al spliterator actual con menos trabajo.Collector
combina la especificación de unreduce
función (de fama de reducción de mapa), con un valor inicial y una función para combinar dos resultados (permitiendo así que se combinen los resultados de flujos de trabajo divididos).Por ejemplo, el recopilador más básico tendría un valor inicial de 0, agregaría un número entero a un resultado existente y 'combinaría' dos resultados agregándolos. Sumando así una corriente dividida de enteros.
Ver:
Spliterator.trySplit()
Collector<T,A,R>
fuente
Los siguientes son ejemplos del uso de los recopiladores predefinidos para realizar tareas comunes de reducción mutable:
fuente
Interfaz
Spliterator
: es una característica central de Streams .Los métodos
stream()
y porparallelStream()
defecto se presentan en laCollection
interfaz. Estos métodos utilizan el Spliterator a través de la llamada aspliterator()
:Spliterator es un iterador interno que divide la secuencia en las partes más pequeñas. Estas partes más pequeñas se pueden procesar en paralelo.
Entre otros métodos, hay dos más importantes para entender el Spliterator:
boolean tryAdvance(Consumer<? super T> action)
A diferencia deIterator
, intenta realizar la operación con el siguiente elemento. Si la operación se ejecutó con éxito, el método regresatrue
. De lo contrario, retornosfalse
, eso significa que hay ausencia de elemento o final de la secuencia.Spliterator<T> trySplit()
Este método permite dividir un conjunto de datos en muchos conjuntos más pequeños de acuerdo con uno u otro criterio (tamaño de archivo, número de líneas, etc.).fuente