Java Academy · Oppitunti

Yleiset sudenkuopat

Välttäkää Streamien yleiset virheet: streamien uudelleenkäyttö, piilevät sivuvaikutukset sekä rinnakkaisuuden ja muuttuvan tilan yhdistäminen.

Oppitunti 3/38 vaihetta

Yleiset sudenkuopat on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/3. 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ä 3 oppituntia.

Johdanto

Streamit ovat tehokkaita, mutta niihin liittyy sudenkuoppia: Streamin uudelleenkäyttö, piilevät sivuvaikutukset sekä rinnakkaisuuden yhdistäminen muuttuvaan tilaan.

Kertakäyttöiset streamit

Stream on kertakäyttöinen: pääteoperaation (forEach, collect, reduce) jälkeen sitä ei voi käyttää uudelleen.

Koodi: uudelleenkäyttövirhe

Pääteoperaation jälkeen Stream on kulutettu; sen uudelleenkäyttöyritys aiheuttaa poikkeuksen IllegalStateException.

import java.util.*;import java.util.stream.*;public class Main {
  public static void main(String[] args) {
    List<Integer> nums = Arrays.asList(1, 2, 3);
    Stream<Integer> s = nums.stream();
    s.forEach(System.out::println); // terminal
    try {
      s.forEach(System.out::println); // reuse -> IllegalStateException
    } catch (IllegalStateException e) {
      System.out.println("Oops: " + e.getMessage());
    }
  }
}

Sivuvaikutukset

Vältä sivuvaikutuksia map/filter-operaatioiden sisällä, kuten ulkoisten listojen muokkaamista. Suosi puhtaita funktioita ja collect()-operaatiota lopussa.

Koodi: sivuvaikutukset ja collect

Tilan muuttaminen käsittelyputkessa on hauraaa. collect()-versio on selkeämpi ja turvallisempi.

import java.util.*;import java.util.stream.*;public class Main {
  public static void main(String[] args) {
    List<Integer> nums = Arrays.asList(1,2,3);
    // Pitfall: mutating external list from map/forEach
    List<Integer> out = new ArrayList<>();
    nums.stream().map(n -> { out.add(n*n); return n*n; }).forEach(x -> {});
    System.out.println("With side effects: " + out);

    // Better: use collect to build the result
    List<Integer> squares = nums.stream().map(n -> n*n).collect(Collectors.toList());
    System.out.println("With collect: " + squares);
  }
}

Koodi: rinnakkaisuus ja muuttuva tila

Rinnakkaiset streamit ja muuttuvat säilöt voivat aiheuttaa kilpailutilanteita. Suosi collect()-operaatiota, joka käsittelee rinnakkaisuuden.

import java.util.*;public class Main {
  public static void main(String[] args) {
    List<Integer> nums = java.util.Arrays.asList(1,2,3,4,5);
    // Pitfall: adding to a normal ArrayList from parallel pipeline (unsafe)
    List<Integer> unsafe = new ArrayList<>();
    nums.parallelStream().forEach(n -> unsafe.add(n)); // may be unsafe
    System.out.println("Parallel add to ArrayList (unsafe demo): " + unsafe);

    // Safer: use built-in collectors
    List<Integer> safe = nums.parallelStream().map(n -> n).collect(java.util.stream.Collectors.toList());
    System.out.println("Collected safely: " + safe);
  }
}

Sudenkuoppien tarkistus

Pikatarkistus: Mikä on tavallinen Streamin sudenkuoppa aloittelijoille?

Kertaus

Kertaus: 1) Streamit ovat kertakäyttöisiä. 2) Vältä sivuvaikutuksia käsittelyputkissa. 3) Älä yhdistä rinnakkaisia streameja suojaamattomaan muuttuvaan tilaan.

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 ”Yleiset sudenkuopat” ilmainen?

Kyllä – oppitunnin ”Yleiset sudenkuopat” 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ä 3 oppituntia.

Mitä opin oppitunnilla ”Yleiset sudenkuopat”?

Välttäkää Streamien yleiset virheet: streamien uudelleenkäyttö, piilevät sivuvaikutukset sekä rinnakkaisuuden ja muuttuvan tilan yhdistäminen. 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/3.

Kuinka kauan ”Yleiset sudenkuopat”-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. Järjestys ja oikosulkuarviointi
  2. Rinnakkaisten streamien perusteet
  3. Yleiset sudenkuopat
← Takaisin: Java Academy