Vanliga fallgropar
Undvik vanliga misstag med Streams: återanvändning av strömmar, dolda sidoeffekter samt parallell bearbetning med föränderligt tillstånd.
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.
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
- Ordning och kortslutningsutvärdering
- Grunderna i parallella strömmar
- Vanliga fallgropar