Spliterator
- Java kursu
- Orta seviye
- Ders 98/116
- 5 dk
Spliterator ile paralel gezinmeyi öğrenirsin.
Spliterator<T> arayüzü
Spliterator<T> Java 8 ile gelen, paralel dolaşmaya uygun Iterator benzeri bir arayüzdür. tryAdvance(action) bir sonraki eleman varsa action'ı çalıştırır ve true döner; yoksa false döner. forEachRemaining(action) kalan tüm elemanları tek seferde işler.
trySplit() Spliterator'ı iki parçaya bölerek paralel işleme izin verir; bu özellik akış (stream) API'sinin paralel işleme temelidir. estimateSize() kalan eleman sayısını tahmin eder.
forEachRemaining ile toplu işleme
forEachRemaining(action) kalan tüm elemanları tek çağrıyla işler. Bu, while (sp.tryAdvance(action)) döngüsünden daha derli topludur; Java arka planda yine tek tek gezer ama daha kısa kod yazılır.
Örneğin bir listeden Spliterator alıp sp.forEachRemaining(s -> System.out.println(s)); yazarsın. -> işareti lambda ifadesidir; bir sonraki grupta ayrıntısı işlenecek. Spliterator, Stream API'nin temel taşıdır; list.stream().spliterator() ile akıştan da alınabilir.
Uygulama Spliterator ile listeyi dolaş
List<String> names = new ArrayList<>(); tanımla; "Ayşe", "Alex", "Mehmet" ekle. Spliterator<String> sp = names.spliterator(); al. sp.forEachRemaining(s -> System.out.println(s)); ile tüm elemanları tek çağrıda yazdır.
Başlangıç kodu
import java.util.List;
import java.util.ArrayList;
import java.util.Spliterator;
public class Main {
public static void main(String[] args) {
// List<String> tanımla, üç isim ekle, Spliterator al, forEachRemaining ile yazdır
}
}Örnek çözüm
import java.util.List;
import java.util.ArrayList;
import java.util.Spliterator;
public class Main {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("Ayşe");
names.add("Alex");
names.add("Mehmet");
Spliterator<String> sp = names.spliterator();
sp.forEachRemaining(s -> System.out.println(s));
}
}Beklenen çıktı
Ayşe Alex Mehmet
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 İlerleme çağrısını tamamla
while (sp.____(s -> System.out.println(s))) { }
while (sp.tryAdvance(s -> System.out.println(s))) { }
Açıklama: tryAdvance bir sonraki eleman varsa action'ı çalıştırır.
2 Spliterator.trySplit ne yapar?
- Tüm elemanları siler
- Yalnızca ilk elemanı verir
- Boş bir Spliterator döndürür
- Spliterator'ı ikiye böler Doğru cevap
Açıklama: trySplit paralel işleme için Spliterator'ı ikiye böler.
3 Spliterator metotlarını eşleştir
| Kavram | Anlamı |
|---|---|
tryAdvance |
Tek eleman işler |
forEachRemaining |
Kalanını toplu işler |
trySplit |
İkiye böler |
estimateSize |
Kalan sayı tahmini |