Java Spliterator è uno dei quattro iteratori – Enumeration, Iterator, ListIterator e Spliterator.
Java Spliterator
Come Iterator e ListIterator, Spliterator è un Iterator di Java, che viene utilizzato per iterare gli elementi uno per uno da un oggetto implementato da List. Alcuni punti importanti su Java Spliterator sono:
- Java Spliterator è un’interfaccia nell’API di Java Collection.
- Il Spliterator è stato introdotto nel Java 8 nel pacchetto
java.util
. - Supporta la funzionalità di programmazione parallela.
- Possiamo usarlo sia per l’API Collection che per le classi dell’API Stream.
- Fornisce caratteristiche sugli oggetti Collection o API.
- NON possiamo usare questo Iterator per le classi implementate da Map.
- Utilizza il metodo
tryAdvance()
per iterare gli elementi singolarmente in più Thread per supportare l’elaborazione parallela. - Utilizza il metodo
forEachRemaining()
per iterare gli elementi in modo sequenziale in un singolo Thread. - Utilizza il metodo
trySplit()
per dividere se stesso in sotto-Spliterator per supportare l’elaborazione parallela. - Lo Spliterator supporta sia l’elaborazione sequenziale che quella parallela dei dati.
Lo Spliterator stesso non fornisce il comportamento di programmazione parallela. Tuttavia, fornisce alcuni metodi per supportarlo. Gli sviluppatori dovrebbero utilizzare i metodi dell’interfaccia Spliterator e implementare la programmazione parallela utilizzando il framework Fork/Join (un buon approccio).
Principali funzionalità dello Spliterator
- Divisione dei dati di origine.
- Elaborazione dei dati di origine.
Diagramma di classe della classe Java Spliterator
Il diagramma seguente mostra il diagramma di classe dell’interfaccia Java Spliterator. Ha molti campi e metodi.
Metodi della classe Java Spliterator
In questa sezione, elencheremo tutti i metodi di Java Spliterator uno per uno con una breve descrizione utile.
- int characteristics(): Restituisce un insieme di caratteristiche di questo Spliterator e dei suoi elementi.
- long estimateSize(): Restituisce una stima del numero di elementi che verrebbero incontrati da una traversata forEachRemaining(), o restituisce Long.MAX_VALUE se infinito, sconosciuto o troppo costoso da calcolare.
- default void forEachRemaining(Consumer action): Esegue l’azione specificata per ogni elemento rimanente, in sequenza nel thread corrente, finché tutti gli elementi non sono stati elaborati o l’azione non genera un’eccezione.
- default Comparator getComparator(): Se la sorgente di questo Spliterator è ORDINATA secondo un Comparator, restituisce tale Comparator.
- default long getExactSizeIfKnown(): Metodo di comodità che restituisce estimateSize() se questo Spliterator ha una dimensione definita, altrimenti -1.
- default boolean hasCharacteristics(int characteristics): Restituisce true se le caratteristiche di questo Spliterator contengono tutte le caratteristiche specificate.
- boolean tryAdvance(Consumer action): Se esiste un elemento rimanente, esegue l’azione specificata su di esso e restituisce true; altrimenti restituisce false.
- Spliterator trySplit(): Se questo spliterator può essere suddiviso, restituisce un Spliterator che copre gli elementi che, al termine di questo metodo, non saranno più coperti da questo Spliterator.
Esempio di Java Spliterator
In questa sezione, parleremo di come creare un oggetto Java Spliterator utilizzando spliterator() e svilupperemo un semplice esempio.
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");
// Ottenere Spliterator
Spliterator namesSpliterator = names.spliterator();
// Attraversare gli elementi
namesSpliterator.forEachRemaining(System.out::println);
}
}
Output:-
Rams
Posa
Chinni
Se osserviamo il programma e l’output sopra, possiamo facilmente capire che il metodo Spliterator.forEachRemaining() funziona allo stesso modo di ArrayList.foreach(). Sì, entrambi funzionano in modo simile.
Vantaggi di Spliterator
- A differenza di Iterator e ListIterator, supporta la funzionalità di programmazione parallela.
- A differenza di Iterator e ListIterator, supporta sia il processing sequenziale che parallelo dei dati.
- Rispetto ad altri Iterators, offre migliori prestazioni.
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. |
Questo è tutto su Spliterator in Java. Riferimento: API Doc
Source:
https://www.digitalocean.com/community/tutorials/java-spliterator