Java Spliterator é um dos quatro iteradores – Enumeration, Iterator, ListIterator e Spliterator.
Java Spliterator
Assim como Iterator e ListIterator, Spliterator é um Iterator em Java, utilizado para iterar elementos um por um a partir de um objeto implementado com List. Alguns pontos importantes sobre o Java Spliterator são:
- Java Spliterator é uma interface na API de Java Collection.
- Spliterator foi introduzido no lançamento do Java 8 no pacote
java.util
. - Ele suporta funcionalidades de programação paralela.
- Podemos utilizá-lo tanto para classes da API de Collection quanto para classes da API de Stream.
- Fornece características sobre objetos da Collection ou da API.
- Não podemos utilizar este Iterator para classes implementadas com Map.
- Ele usa o método
tryAdvance()
para iterar elementos individualmente em vários Threads para suportar Processamento Paralelo. - Ele usa o método
forEachRemaining()
para iterar elementos sequencialmente em um único Thread. - Ele usa o método
trySplit()
para dividir a si mesmo em Sub-Spliterators para suportar Processamento Paralelo. - O Spliterator suporta tanto o processamento Sequencial quanto o Paralelo de dados.
O Spliterator em si não fornece o comportamento de programação paralela. No entanto, ele fornece alguns métodos para suportá-lo. Os desenvolvedores devem utilizar os métodos da interface Spliterator e implementar a programação paralela usando o Framework Fork/Join (uma abordagem boa).
Funcionalidades Principais do Spliterator
- Dividindo os dados de origem.
- Processando os dados de origem.
Diagrama de Classe do Spliterator Java
O diagrama a seguir mostra o Diagrama de Classe da interface Spliterator Java. Ele possui muitos campos e métodos.
Métodos do Spliterator Java
Nesta seção, listaremos todos os métodos Java Spliterator um por um, com uma descrição útil.
- int characteristics(): Retorna um conjunto de características deste Spliterator e seus elementos.
- long estimateSize(): Retorna uma estimativa do número de elementos que seriam encontrados por uma travessia forEachRemaining(), ou retorna Long.MAX_VALUE se for infinito, desconhecido ou muito caro para calcular.
- default void forEachRemaining(Consumer action): Executa a ação fornecida para cada elemento restante, sequencialmente na thread atual, até que todos os elementos tenham sido processados ou a ação lance uma exceção.
- default Comparator getComparator(): Se a fonte deste Spliterator estiver ORDENADA por um Comparator, retorna esse Comparator.
- default long getExactSizeIfKnown(): Método conveniente que retorna estimateSize() se este Spliterator for de tamanho conhecido (SIZED), caso contrário, retorna -1.
- default boolean hasCharacteristics(int characteristics): Retorna true se as características deste Spliterator contiverem todas as características fornecidas.
- boolean tryAdvance(Consumer action): Se um elemento restante existir, executa a ação fornecida nele, retornando true; caso contrário, retorna false.
- Spliterator trySplit(): Se esse spliterator puder ser particionado, retorna um Spliterator que cobre elementos que, após o retorno deste método, não serão cobertos por este Spliterator.
Exemplo de Java Spliterator
Nesta seção, discutiremos como criar um objeto Java Spliterator usando spliterator() e desenvolveremos um exemplo simples.
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");
// Obtendo o Spliterator
Spliterator namesSpliterator = names.spliterator();
// Percorrendo os elementos
namesSpliterator.forEachRemaining(System.out::println);
}
}
Saída:-
Rams
Posa
Chinni
Se observarmos o programa acima e a saída, podemos entender facilmente que o método Spliterator.forEachRemaining() funciona da mesma forma que ArrayList.foreach(). Sim, ambos funcionam de maneira semelhante.
Vantagens do Spliterator
- Ao contrário do Iterator e ListIterator, ele suporta funcionalidades de Programação Paralela.
- Ao contrário do Iterator e ListIterator, ele suporta o Processamento de Dados tanto Sequencial quanto Paralelo.
- Comparado a outros Iterators, ele oferece melhor desempenho.
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. |
Isso é tudo sobre Spliterator em Java. Referência: API Doc
Source:
https://www.digitalocean.com/community/tutorials/java-spliterator