Spliterator: splitsen voor parallelisme
Implementeer een aangepaste Spliterator om domeingegevens beschikbaar te maken als een splitsbare streambron.
Spliterator: splitsen voor parallelisme is een gratis Java Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.
Wat is een Spliterator?
Een Spliterator (splitsbare iterator) is het kernmechanisme achter streams. Het doorloopt elementen en kan zichzelf in twee delen splitsen voor parallelle verwerking.
Belangrijkste methoden van Spliterator
Vier kernmethoden: tryAdvance (één element verwerken), forEachRemaining (alle resterende elementen verwerken), trySplit (in twee delen splitsen), estimateSize (schatting van het aantal elementen).
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 6Eigenschappen van Spliterator
Spliterators geven hun eigenschappen aan met bitvlaggen: 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, SUBSIZEDHoe trySplit werkt
trySplit() geeft een nieuwe Spliterator terug die ongeveer de helft van de resterende elementen omvat. De oorspronkelijke Spliterator omvat de andere helft. Geef null terug als splitsen niet mogelijk is.
// ArrayList Spliterator splits efficiently at midpoint:
// [0,1,2,3,4,5] -> [0,1,2] (new) + [3,4,5] (original)Een aangepaste Spliterator bouwen
Implementeer Spliterator<T> om een aangepaste gegevensstructuur beschikbaar te maken als bron voor een stream. Definieer trySplit om parallelle verwerking mogelijk te maken.
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; }
}Een stream maken met Spliterator
Gebruik StreamSupport.stream(spliterator, parallel) om vanaf elke spliterator een stream te maken — de brug tussen aangepaste gegevensbronnen en de 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 voor een binaire boom
Aangepaste Spliterators maken parallelle verwerking mogelijk voor structuren die geen lijsten zijn, zoals bomen. trySplit geeft de Spliterator van de linker deelboom terug en behoudt de rechter deelboom.
Efficiëntie van parallelle verwerking en kwaliteit van splitsingen
Parallelle streams splitsen recursief totdat de delen klein genoeg zijn voor één thread. Goed splitsen vereist dat estimateSize nauwkeurig is en dat de splitsingen ongeveer even groot zijn.
forEachRemaining voor groepsverwerking
Als splitsen niet nodig is, overschrijf je forEachRemaining voor groepsverwerking die de overhead per element vermijdt die ontstaat wanneer je tryAdvance in een lus gebruikt.
@Override
public void forEachRemaining(Consumer<? super Integer> action) {
for (int i = start; i < end; i++) action.accept(i);
start = end; // mark as exhausted
}Spliterator versus Iterator
Iterator: alleen sequentieel, geen aanwijzing voor de grootte en niet splitsbaar. Spliterator: geschikt voor parallelle verwerking, biedt eigenschappen en een schatting van de grootte en is ontworpen voor de Stream API.
Korte controle
Wat geeft trySplit() terug wanneer splitsen niet mogelijk is?
Samenvatting
Spliterator is de motor van parallelle streams. Implementeer tryAdvance, trySplit, estimateSize en characteristics om aangepaste gegevensstructuren als streams beschikbaar te maken. Gebruik StreamSupport.stream(sp, true) om parallel te gaan.
Leer Java met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 104
- Lessen
- 374
Veelgestelde vragen
Is de les “Spliterator: splitsen voor parallelisme” gratis?
Ja — de volledige tekst van “Spliterator: splitsen voor parallelisme” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.
Wat leer ik in “Spliterator: splitsen voor parallelisme”?
Implementeer een aangepaste Spliterator om domeingegevens beschikbaar te maken als een splitsbare streambron. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Java Academy te beginnen?
Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Spliterator: splitsen voor parallelisme”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Java Academy?
Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- flatMap voor geneste collecties
- Parallelle streams: prestaties en valkuilen
- Spliterator: splitsen voor parallelisme
- Oneindige streams met iterate en generate