Estou tendo problemas para entender a Stream
interface no Java 8, especialmente no que diz respeito às interfaces Spliterator
e Collector
. Meu problema é que eu simplesmente não consigo entender Spliterator
e as Collector
interfaces ainda e, como resultado, a Stream
interface ainda é um tanto obscura para mim.
O que exatamente é a Spliterator
e a Collector
, e como posso usá-los? Se estou disposto a escrever o meu próprio ( Spliterator
ou Collector
provavelmente o meu Stream
nesse processo), o que devo fazer e não fazer?
Li alguns exemplos espalhados pela web, mas como tudo aqui ainda é novo e está sujeito a alterações, exemplos e tutoriais ainda são muito escassos.
fonte
Collectors.of
um método antigo da versão beta que foi removido ou estou-me faltando alguma coisa? Para completar,(x,y) -> x+y
pode ser escrito comoInteger::sum
.Spliterator
basicamente significa "Iterador divisível".Um thread único pode percorrer / processar todo o Spliterator em si, mas o Spliterator também possui um método
trySplit()
que " separará " uma seção para outra pessoa (normalmente, outro thread) processar - deixando o atual spliterator com menos trabalho.Collector
combina a especificação de umareduce
função (de fama de redução de mapa), com um valor inicial e uma função para combinar dois resultados (permitindo assim que os resultados dos fluxos de trabalho Spliterated sejam combinados).Por exemplo, o coletor mais básico teria um valor inicial de 0, adicionaria um número inteiro a um resultado existente e 'combinaria' dois resultados adicionando-os. Somando assim um fluxo dividido de números inteiros.
Vejo:
Spliterator.trySplit()
Collector<T,A,R>
fonte
A seguir, exemplos de uso de coletores predefinidos para executar tarefas comuns de redução mutável:
fonte
Interface
Spliterator
- é um recurso principal do Streams .Os métodos
stream()
eparallelStream()
padrão são apresentados naCollection
interface. Esses métodos usam o Spliterator através da chamada paraspliterator()
:Spliterator é um iterador interno que divide o fluxo em partes menores. Essas peças menores podem ser processadas em paralelo.
Entre outros métodos, existem dois mais importantes para entender o Spliterator:
boolean tryAdvance(Consumer<? super T> action)
Ao contrário doIterator
, ele tenta executar a operação com o próximo elemento. Se a operação for executada com sucesso, o método retornarátrue
. Caso contrário, retornafalse
- isso significa que há ausência de elemento ou final do fluxo.Spliterator<T> trySplit()
Este método permite dividir um conjunto de dados em muitos conjuntos menores, de acordo com um ou outro critério (tamanho do arquivo, número de linhas, etc.).fonte