Java Academy · Lektion

Vanliga fallgropar

Undvik vanliga misstag med Streams: återanvändning av strömmar, dolda sidoeffekter samt parallell bearbetning med föränderligt tillstånd.

Lektion 3 av 38 steg

Vanliga fallgropar är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 3 av 3. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 3 lektioner.

Introduktion

Streams är kraftfulla, men har fallgropar: att återanvända en Stream, dolda bieffekter och att blanda parallell bearbetning med föränderligt tillstånd.

Streams som bara kan användas en gång

En Stream kan bara användas en gång: efter en terminal operation (forEach, collect, reduce) kan den inte användas igen.

Kod: återanvändningsfel

Efter en terminal operation är Stream förbrukad. Om du försöker återanvända den kastas 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());
    }
  }
}

Bieffekter

Undvik bieffekter inuti map/filter, till exempel att ändra externa listor. Föredra rena funktioner och collect() i slutet.

Kod: bieffekter jämfört med collect

Att ändra tillstånd i pipelinen är känsligt. Versionen med collect() är tydligare och säkrare.

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

Kod: parallell + föränderligt tillstånd

Parallella streams och föränderliga behållare kan orsaka race conditions. Föredra collect(), som hanterar samtidighet.

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

Kontroll av fallgropar

Snabb kontroll: Vilken är en vanlig Stream-fallgrop för nybörjare?

Sammanfattning

Sammanfattning: 1) Streams kan bara användas en gång. 2) Undvik bieffekter i pipelines. 3) Blanda inte parallella streams med osäkert föränderligt tillstånd.

Gratis att börja

Lär dig Java med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
104
Lektioner
374

Vanliga frågor

Är lektionen ”Vanliga fallgropar” gratis?

Ja – hela texten till ”Vanliga fallgropar” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 3 lektioner.

Vad lär jag mig i ”Vanliga fallgropar”?

Undvik vanliga misstag med Streams: återanvändning av strömmar, dolda sidoeffekter samt parallell bearbetning med föränderligt tillstånd. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Java Academy?

Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 3.

Hur lång tid tar lektionen ”Vanliga fallgropar”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Java Academy-lektionen?

Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Ordning och kortslutningsutvärdering
  2. Grunderna i parallella strömmar
  3. Vanliga fallgropar
← Tillbaka till Java Academy