0Pricing
Java Academy · Lezione

Spliterator: suddivisione per il parallelismo

Implementi uno Spliterator personalizzato per esporre i dati del dominio come sorgente di stream suddivisibile.

Spliterator: suddivisione per il parallelismo è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.

Che cos'è uno Spliterator?

Uno Spliterator (iteratore suddivisibile) è il meccanismo alla base degli stream. Itera sugli elementi e può suddividersi in due parti per l'elaborazione parallela.

Metodi principali di Spliterator

I quattro metodi principali sono: tryAdvance (elabora un elemento), forEachRemaining (elabora tutti gli elementi rimanenti), trySplit (suddivide in due parti), estimateSize (stima il numero di elementi).

Spliterator<Integer> sp = List.of(1,2,3,4,5,6).spliterator();
Spliterator<Integer> half = sp.trySplit(); // splits off first ~half
half.forEachRemaining(System.out::println); // 1 2 3
sp.forEachRemaining(System.out::println);   // 4 5 6

Caratteristiche di Spliterator

Gli Spliterator dichiarano le proprie caratteristiche tramite flag di bit: SIZED, ORDERED, DISTINCT, SORTED, NONNULL, IMMUTABLE, CONCURRENT, SUBSIZED.

Spliterator<String> sp = List.of("a","b","c").spliterator();
System.out.println(Integer.toBinaryString(sp.characteristics()));
// Characteristics include ORDERED, SIZED, SUBSIZED

Come funziona trySplit

trySplit() restituisce un nuovo Spliterator che copre all'incirca metà degli elementi rimanenti. L'originale copre l'altra metà. Restituisca null se la suddivisione non è possibile.

// ArrayList Spliterator splits efficiently at midpoint:
// [0,1,2,3,4,5] -> [0,1,2] (new) + [3,4,5] (original)

Creare uno Spliterator personalizzato

Implementi Spliterator<T> per esporre una struttura dati personalizzata come sorgente di uno stream. Definisca trySplit per abilitare il parallelismo.

public class RangeSpliterator implements Spliterator<Integer> {
    private int start, end;
    public RangeSpliterator(int start, int end) { this.start=start; this.end=end; }
    public boolean tryAdvance(Consumer<? super Integer> action) {
        if (start >= end) return false;
        action.accept(start++); return true;
    }
    public Spliterator<Integer> trySplit() {
        int mid = (start + end) / 2;
        if (mid <= start) return null;
        RangeSpliterator prefix = new RangeSpliterator(start, mid);
        this.start = mid; return prefix;
    }
    public long estimateSize() { return end - start; }
    public int characteristics() { return ORDERED | SIZED | SUBSIZED | IMMUTABLE; }
}

Creare uno stream da uno Spliterator

Usi StreamSupport.stream(spliterator, parallel) per creare uno stream da qualsiasi spliterator: il collegamento tra sorgenti dati personalizzate e la Stream API.

Spliterator<Integer> sp = new RangeSpliterator(0, 1_000_000);
Stream<Integer> stream = StreamSupport.stream(sp, true); // true = parallel
long count = stream.filter(n -> n % 2 == 0).count();
System.out.println(count); // 500000

Spliterator per un albero binario

Gli Spliterator personalizzati consentono il parallelismo su strutture non basate su liste, come gli alberi. trySplit restituisce lo Spliterator del sottoalbero sinistro e conserva quello destro.

Efficienza del parallelismo e qualità della suddivisione

Gli stream paralleli suddividono ricorsivamente i dati finché i blocchi non sono abbastanza piccoli da poter essere elaborati da un singolo thread. Una buona suddivisione richiede che estimateSize sia accurato e che le parti siano all'incirca della stessa dimensione.

forEachRemaining per l'elaborazione in blocco

Se non è necessaria alcuna suddivisione, sovrascriva forEachRemaining per eseguire un'elaborazione in blocco che eviti l'overhead per elemento di un ciclo con tryAdvance.

@Override
public void forEachRemaining(Consumer<? super Integer> action) {
    for (int i = start; i < end; i++) action.accept(i);
    start = end; // mark as exhausted
}

Spliterator e Iterator a confronto

Iterator: solo sequenziale, nessun suggerimento sulla dimensione e nessuna suddivisione. Spliterator: compatibile con il parallelismo, fornisce caratteristiche e una stima della dimensione ed è progettato per la Stream API.

Verifica rapida

Che cosa restituisce trySplit() quando la suddivisione non è possibile?

Riepilogo

Spliterator è il motore degli stream paralleli. Implementi tryAdvance, trySplit, estimateSize e characteristics per esporre strutture dati personalizzate come stream. Usi StreamSupport.stream(sp, true) per abilitare il parallelismo.

Domande Frequenti

La lezione «Spliterator: suddivisione per il parallelismo» è gratuita?

Sì — il testo completo di «Spliterator: suddivisione per il parallelismo» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.

Cosa imparerò in «Spliterator: suddivisione per il parallelismo»?

Implementi uno Spliterator personalizzato per esporre i dati del dominio come sorgente di stream suddivisibile. Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Java Academy?

Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Spliterator: suddivisione per il parallelismo»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Java Academy?

Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. flatMap per collezioni annidate
  2. Stream paralleli: prestazioni e insidie
  3. Spliterator: suddivisione per il parallelismo
  4. Stream infiniti con iterate e generate
← Torna a Java Academy