Tengo problemas para comprender la Streaminterfaz en Java 8, especialmente cuando tiene que ver con las interfaces Spliteratory Collector. Mi problema es que simplemente no puedo entender Spliteratorlas Collectorinterfaces y todavía, y como resultado, la Streaminterfaz todavía es algo oscura para mí.
¿Qué es exactamente ay Spliteratora Collector, y cómo puedo usarlos? Si estoy dispuesto a escribir el mío Spliteratoro Collector(y probablemente el mío Streamen 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.ofSe eliminó un método antiguo de versión beta o me falta algo? Para completar,(x,y) -> x+yse puede escribir comoInteger::sum.Spliteratorbá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.Collectorcombina la especificación de unreducefunció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 laCollectioninterfaz. 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