Spliterator: Opdeling til parallelisering
Implementér en brugerdefineret Spliterator, der eksponerer domænedata som en stream-kilde, der kan opdeles.
Spliterator: Opdeling til parallelisering er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.
Hvad er en Spliterator
En Spliterator (iterator, der kan opdeles) er den centrale mekanisme bag streams. Den gennemløber elementer og kan opdele sig selv i to dele til parallel behandling.
Vigtige Spliterator-metoder
Fire centrale metoder: tryAdvance (behandl ét element), forEachRemaining (behandl alle resterende), trySplit (opdel i to), estimateSize (estimat over antal 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-egenskaber
Spliteratorer angiver deres egenskaber med bitflag: 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, SUBSIZEDSådan fungerer trySplit
trySplit() returnerer en ny Spliterator, der dækker omtrent halvdelen af de resterende elementer. Den oprindelige dækker den anden halvdel. Returnér null, hvis opdeling ikke er mulig.
// ArrayList Spliterator splits efficiently at midpoint:
// [0,1,2,3,4,5] -> [0,1,2] (new) + [3,4,5] (original)Opret en brugerdefineret Spliterator
Implementér Spliterator<T> for at eksponere en brugerdefineret datastruktur som en streamkilde. Definér trySplit for at aktivere parallel 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; }
}Opret en stream fra en Spliterator
Brug StreamSupport.stream(spliterator, parallel) til at oprette en stream fra enhver spliterator — bindeleddet mellem brugerdefinerede datakilder og Stream API'et.
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 til et binært træ
Brugerdefinerede Spliteratorer muliggør parallel behandling af ikke-listebaserede strukturer som træer. trySplit returnerer Spliteratoren for det venstre undertræ og beholder det højre.
Parallel effektivitet og kvaliteten af opdelingen
Parallelle streams opdeler rekursivt, indtil delene er små nok til en enkelt tråd. En god opdeling kræver, at estimateSize er nøjagtig, og at opdelingerne er omtrent lige store.
forEachRemaining til massebehandling
Hvis der ikke er behov for opdeling, kan du tilsidesætte forEachRemaining til massebehandling, der undgår omkostningen pr. element ved 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: kun sekventiel, intet størrelseshint, ingen opdeling. Spliterator: kan køre parallelt, leverer egenskaber og et størrelsesestimat og er designet til Stream API'et.
Hurtigt tjek
Hvad returnerer trySplit(), når opdeling ikke er mulig?
Opsamling
Spliterator er motoren bag parallelle streams. Implementér tryAdvance, trySplit, estimateSize og characteristics for at eksponere brugerdefinerede datastrukturer som streams. Brug StreamSupport.stream(sp, true) til at køre parallelt.
Lær Java med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 104
- Lektioner
- 374
Ofte stillede spørgsmål
Er lektionen “Spliterator: Opdeling til parallelisering” gratis?
Ja — hele teksten til “Spliterator: Opdeling til parallelisering” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Spliterator: Opdeling til parallelisering”?
Implementér en brugerdefineret Spliterator, der eksponerer domænedata som en stream-kilde, der kan opdeles. Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Java Academy?
Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Spliterator: Opdeling til parallelisering”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Java Academy-lektion?
Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- flatMap til indlejrede samlinger
- Parallelle streams: Ydeevne og faldgruber
- Spliterator: Opdeling til parallelisering
- Uendelige streams med iterate og generate