0Pricing
Java Academy · Pelajaran

Spliterator: Pemisahan untuk Paralelisme

Implementasikan Spliterator khusus untuk menyajikan data domain sebagai sumber stream yang dapat dipecah.

Spliterator: Pemisahan untuk Paralelisme adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Apa Itu Spliterator?

Spliterator (Iterator yang Dapat Dibagi) adalah mekanisme inti di balik aliran. Mekanisme ini melakukan iterasi pada elemen dan dapat membagi dirinya menjadi dua bagian untuk pemrosesan paralel.

Metode Utama Spliterator

Empat metode inti: tryAdvance (memproses satu elemen), forEachRemaining (memproses semua elemen yang tersisa), trySplit (membagi menjadi dua), dan estimateSize (perkiraan jumlah elemen).

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

Karakteristik Spliterator

Spliterator menyatakan karakteristiknya dengan penanda 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

Cara Kerja trySplit

trySplit() mengembalikan Spliterator baru yang mencakup kira-kira setengah dari elemen yang tersisa. Spliterator asli mencakup setengah lainnya. Kembalikan null jika pembagian tidak memungkinkan.

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

Membangun Spliterator Khusus

Implementasikan Spliterator<T> untuk mengekspos struktur data khusus sebagai sumber aliran. Definisikan trySplit untuk mengaktifkan paralelisme.

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; }
}

Membuat Aliran dari Spliterator

Gunakan StreamSupport.stream(spliterator, parallel) untuk membuat aliran dari spliterator apa pun — penghubung antara sumber data khusus dan API Aliran.

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 untuk Pohon Biner

Spliterator khusus memungkinkan paralelisme pada struktur non-daftar seperti pohon. trySplit mengembalikan spliterator subpohon kiri dan mempertahankan subpohon kanan.

Efisiensi Paralel dan Kualitas Pembagian

Aliran paralel membagi data secara rekursif hingga setiap bagian cukup kecil untuk satu utas. Pembagian yang baik memerlukan estimateSize yang akurat dan pembagian yang kira-kira sama besar.

forEachRemaining untuk Pemrosesan Massal

Jika pembagian tidak diperlukan, timpa forEachRemaining untuk pemrosesan massal yang menghindari biaya tambahan per elemen dari tryAdvance dalam sebuah loop.

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

Spliterator dibandingkan dengan Iterator

Iterator: hanya berurutan, tidak memiliki petunjuk ukuran, dan tidak dapat dibagi. Spliterator: mampu berjalan secara paralel, menyediakan karakteristik dan perkiraan ukuran, serta dirancang untuk API Aliran.

Pemeriksaan Singkat

Apa yang dikembalikan oleh trySplit() ketika pembagian tidak memungkinkan?

Ringkasan

Spliterator adalah mesin aliran paralel. Implementasikan tryAdvance, trySplit, estimateSize, dan characteristics untuk mengekspos struktur data khusus sebagai aliran. Gunakan StreamSupport.stream(sp, true) untuk menjalankannya secara paralel.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Spliterator: Pemisahan untuk Paralelisme” gratis?

Ya — teks lengkap “Spliterator: Pemisahan untuk Paralelisme” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Spliterator: Pemisahan untuk Paralelisme”?

Implementasikan Spliterator khusus untuk menyajikan data domain sebagai sumber stream yang dapat dipecah. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Spliterator: Pemisahan untuk Paralelisme” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. flatMap untuk Koleksi Bersarang
  2. Stream Paralel: Kinerja dan Jebakan
  3. Spliterator: Pemisahan untuk Paralelisme
  4. Stream Tak Terbatas dengan iterate dan generate
← Kembali ke Java Academy