Yleiset sudenkuopat
Välttäkää Streamien yleiset virheet: streamien uudelleenkäyttö, piilevät sivuvaikutukset sekä rinnakkaisuuden ja muuttuvan tilan yhdistäminen.
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.
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
- Järjestys ja oikosulkuarviointi
- Rinnakkaisten streamien perusteet
- Yleiset sudenkuopat