Spliterator: oppdeling for parallellitet
Implementer en egendefinert Spliterator for å eksponere domenedata som en strømkilde som kan deles opp.
Spliterator: oppdeling for parallellitet er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva er en Spliterator?
En Spliterator (Splittable Iterator) er den grunnleggende mekanismen bak strømmer. Den itererer over elementer og kan dele seg selv i to deler for parallell behandling.
Viktige Spliterator-metoder
Fire sentrale metoder: tryAdvance (behandler ett element), forEachRemaining (behandler alle gjenværende elementer), trySplit (deler opp i to), estimateSize (estimat for antall elementer).
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 6Spliterator-egenskaper
Spliterator-er oppgir egenskapene sine med bitflagg: 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, SUBSIZEDSlik fungerer trySplit
trySplit() returnerer en ny Spliterator som dekker omtrent halvparten av de gjenværende elementene. Den opprinnelige Spliterator-en dekker den andre halvparten. Returner null hvis oppdeling ikke er mulig.
// ArrayList Spliterator splits efficiently at midpoint:
// [0,1,2,3,4,5] -> [0,1,2] (new) + [3,4,5] (original)Bygge en egendefinert Spliterator
Implementer Spliterator<T> for å eksponere en egendefinert datastruktur som kilde for en strøm. Definer trySplit for å muliggjøre parallell behandling.
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; }
}Opprette en strøm fra en Spliterator
Bruk StreamSupport.stream(spliterator, parallel) for å opprette en strøm fra en hvilken som helst spliterator – broen mellom egendefinerte datakilder og 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); // 500000Spliterator for et binærtre
Egendefinerte Spliterator-er muliggjør parallell behandling av strukturer som ikke er lister, for eksempel trær. trySplit returnerer Spliterator-en for det venstre undertreet og beholder det høyre.
Parallell effektivitet og kvaliteten på oppdelingen
Parallelle strømmer deler dataene rekursivt opp til delene er små nok for én tråd. God oppdeling krever at estimateSize er nøyaktig, og at delene er omtrent like store.
forEachRemaining for massebehandling
Hvis det ikke er nødvendig å dele opp, kan De overstyre forEachRemaining for massebehandling som unngår kostnaden per element ved å kalle tryAdvance i en løkke.
@Override
public void forEachRemaining(Consumer<? super Integer> action) {
for (int i = start; i < end; i++) action.accept(i);
start = end; // mark as exhausted
}Spliterator kontra Iterator
Iterator: bare sekvensiell, gir ingen størrelsesindikasjon og kan ikke deles opp. Spliterator: støtter parallell behandling, oppgir egenskaper og størrelsesestimat og er utformet for Stream API.
Hurtigsjekk
Hva returnerer trySplit() når oppdeling ikke er mulig?
Oppsummering
Spliterator er motoren i parallelle strømmer. Implementer tryAdvance, trySplit, estimateSize og characteristics for å eksponere egendefinerte datastrukturer som strømmer. Bruk StreamSupport.stream(sp, true) for å kjøre parallelt.
Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 104
- Leksjoner
- 374
Ofte stilte spørsmål
Er leksjonen «Spliterator: oppdeling for parallellitet» gratis?
Ja – hele teksten i «Spliterator: oppdeling for parallellitet» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Spliterator: oppdeling for parallellitet»?
Implementer en egendefinert Spliterator for å eksponere domenedata som en strømkilde som kan deles opp. Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Java Academy?
Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Spliterator: oppdeling for parallellitet»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?
Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- flatMap for nestede samlinger
- Parallelle strømmer: ytelse og fallgruver
- Spliterator: oppdeling for parallellitet
- Uendelige strømmer med iterate og generate