Java Academy · Oppitunti

Spliterator: jakaminen rinnakkaisuutta varten

Toteuta mukautettu Spliterator, joka tarjoaa toimialueen datan jaettavana stream-lähteenä.

Oppitunti 3/412 vaihetta

Spliterator: jakaminen rinnakkaisuutta varten on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mikä on Spliterator?

Spliterator (jaettava iteraattori) on streamien keskeinen mekanismi. Se käy alkiot läpi ja voi jakaa itsensä kahdeksi osaksi rinnakkaista käsittelyä varten.

Spliteratorin keskeiset metodit

Neljä keskeistä metodia: tryAdvance (käsittelee yhden alkion), forEachRemaining (käsittelee kaikki jäljellä olevat alkiot), trySplit (jakaa kahdeksi osaksi) ja estimateSize (arvioi alkioiden määrän).

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

Spliteratorin ominaisuudet

Spliteratorit ilmoittavat ominaisuutensa bittilipuilla: 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

Miten trySplit toimii

trySplit() palauttaa uuden Spliteratorin, joka kattaa suunnilleen puolet jäljellä olevista alkioista. Alkuperäinen Spliterator kattaa toisen puolikkaan. Palauttakaa null, jos jakaminen ei ole mahdollista.

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

Mukautetun Spliteratorin rakentaminen

Toteuttakaa Spliterator<T>, jotta voitte tuoda mukautetun tietorakenteen streamin lähteeksi. Määritelkää trySplit rinnakkaisuuden mahdollistamiseksi.

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

Streamin luominen Spliteratorista

Käyttäkää StreamSupport.stream(spliterator, parallel)-metodia streamin luomiseen mistä tahansa spliteratorista — se muodostaa sillan mukautettujen tietolähteiden ja Stream API:n välille.

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 binääripuulle

Mukautetut Spliteratorit mahdollistavat rinnakkaisuuden muissa kuin listarakenteissa, kuten puissa. trySplit palauttaa vasemman alipuun spliteratorin ja säilyttää oikean alipuun.

Rinnakkaisuuden tehokkuus ja jakamisen laatu

Rinnakkaiset streamit jakavat aineiston rekursiivisesti, kunnes osat ovat yhdelle säikeelle riittävän pieniä. Hyvä jakaminen edellyttää, että estimateSize on tarkka ja jaot ovat suunnilleen samankokoisia.

forEachRemaining massakäsittelyyn

Jos jakamista ei tarvita, korvatkaa forEachRemaining-metodi massakäsittelyä varten, jotta vältätte silmukassa suoritettavan tryAdvance-metodin alkio-kohtaisen yleiskustannuksen.

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

Spliterator ja Iterator

Iterator: vain peräkkäiseen käsittelyyn, ei kokovihjettä eikä jakamista. Spliterator: tukee rinnakkaisuutta, tarjoaa ominaisuudet ja kokoarvion sekä on suunniteltu Stream API:a varten.

Pikatarkistus

Mitä trySplit() palauttaa, kun jakaminen ei ole mahdollista?

Kertaus

Spliterator on rinnakkaisten streamien moottori. Toteuttakaa tryAdvance, trySplit, estimateSize ja characteristics, jotta voitte tarjota mukautetut tietorakenteet streameina. Käyttäkää StreamSupport.stream(sp, true)-kutsua rinnakkaiskäsittelyyn siirtymiseen.

Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Spliterator: jakaminen rinnakkaisuutta varten” ilmainen?

Kyllä – oppitunnin ”Spliterator: jakaminen rinnakkaisuutta varten” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Spliterator: jakaminen rinnakkaisuutta varten”?

Toteuta mukautettu Spliterator, joka tarjoaa toimialueen datan jaettavana stream-lähteenä. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Spliterator: jakaminen rinnakkaisuutta varten”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. flatMap sisäkkäisille kokoelmille
  2. Rinnakkaiset streamit: suorituskyky ja sudenkuopat
  3. Spliterator: jakaminen rinnakkaisuutta varten
  4. Infinite Streams with iterate and generate
← Takaisin: Java Academy