Java Spliterator

java spliterator é um dos quatro iteradores – enumeração, iterator, listiterator e spliterator.

java spliterator

assim como iterator e listiterator, spliterator é um iterator em java, usado para iterar elementos um por um de um objeto implementado como list. alguns pontos importantes sobre java spliterator são:

  1. java spliterator é uma interface na api de java collection.
  2. spliterator foi introduzido na versão java 8 na biblioteca java.util.
  3. ele suporta funcionalidades de programação paralela.
  4. podemos usá-lo tanto para classes da api de coleções quanto para classes da api de stream.
  5. fornece características sobre objetos da coleção ou api.
  6. não podemos usar este iterator para classes implementadas como map.
  7. Ele usa o método tryAdvance() para iterar elementos individualmente em vários Threads para suportar o Processamento Paralelo.
  8. Ele usa o método forEachRemaining() para iterar elementos sequencialmente em um único Thread.
  9. Ele usa o método trySplit() para dividir a si mesmo em Sub-Spliterators para suportar o Processamento Paralelo.
  10. O Spliterator suporta tanto o processamento Sequencial quanto o Paralelo dos 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 boa abordagem).

Principais Funcionalidades do Spliterator

  • Dividir os dados de origem.
  • Processar 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 do Java Spliterator um por um, com alguma descrição útil.

  1. – **int characteristics():** Retorna um conjunto de características deste Spliterator e de seus elementos.

  2. – **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.

  3. – **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.

  4. – **default Comparator getComparator():** Se a fonte deste Spliterator estiver ORDENADA por um comparador, retorna esse comparador.

  5. – **default long getExactSizeIfKnown():** Método de conveniência que retorna estimateSize() se este Spliterator for de TAMANHO conhecido, caso contrário, retorna -1.

  6. – **default boolean hasCharacteristics(int characteristics):** Retorna true se as características() deste Spliterator contiverem todas as características fornecidas.

  7. – **boolean tryAdvance(Consumer action):** Se um elemento restante existir, executa a ação fornecida nele, retornando true; caso contrário, retorna false.

  8. – **Spliterator trySplit():** Se este spliterator puder ser particionado, retorna um Spliterator cobrindo 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 elementos
	namesSpliterator.forEachRemaining(System.out::println);			
   }
}

Saída: –

Rams
Posa
Chinni

Se observarmos o programa acima e a saída, podemos entender facilmente que este método Spliterator.forEachRemaining() funciona da mesma maneira que ArrayList.foreach(). Sim, ambos funcionam de maneira semelhante.

Vantagens do Spliterator

  1. Ao contrário do Iterator e ListIterator, ele suporta funcionalidades de Programação Paralela.
  2. Ao contrário do Iterator e ListIterator, ele suporta tanto o Processamento Sequencial quanto o Paralelo de dados.
  3. Comparado a outros Iteradores, ele fornece 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 o Spliterator em Java. Referência: Documento da API

Source:
https://www.digitalocean.com/community/tutorials/java-spliterator