Håndtering af Værdier med Optional-Klassen
I Java kan variabler, der gemmer objekter, indeholde en null-værdi. Dette fører ofte til NullPointerException, hvis null ikke håndteres korrekt. Disse fejl gør koden mindre pålidelig og sværere at vedligeholde. Her kommer Optional ind i billedet.
Tænk på det som en boks—den kan indeholde en værdi, eller den kan være tom. I stedet for at bruge if-sætninger til at tjekke for null, arbejder du med denne "boks" og bruger praktiske metoder til sikkert at hente værdien, hvis den findes.
Syntaks og brug af Optional
Hovedformålet med Optional er at undgå NullPointerException ved at erstatte standard if (value != null)-tjek med mere læsbare metoder.
Der er tre måder at oprette en Optional på:
Optional.empty()– opretter en tomOptionaluden værdi;Optional.of(value)– indkapsler det givne objekt, men kun hvis det med sikkerhed ikke er null;Optional.ofNullable(value)– indkapsler objektet, selv hvis det ernull, og opretter enten en fyldtOptionaleller en tom.
Main.java
123456789101112131415package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> emptyOpt = Optional.empty(); Optional<String> optWithValue = Optional.of("Laptop"); Optional<String> optNullable = Optional.ofNullable(null); System.out.println("Empty Optional: " + emptyOpt); System.out.println("Optional with value: " + optWithValue); System.out.println("Optional with null: " + optNullable); } }
Hvis du sender null til Optional.of(value), vil programmet kaste en NullPointerException, så ofNullable() bør altid bruges til potentielt tomme værdier.
Hentning af værdier fra Optional
For at udtrække en værdi fra en Optional, kan du bruge get()-metoden.
Main.java
12345678910package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> optWithValue = Optional.of("Laptop"); System.out.println("Final string: " + optWithValue.get()); } }
Her returnerer get() det faktiske objekt, der er gemt i Optional. Hvis Optional dog er tom (indeholder null), vil et kald til get() kaste en NoSuchElementException.
Kontrol af en værdi
Ved arbejde med Optional skal du kontrollere, om den indeholder en værdi. En måde at gøre dette på er med isPresent(), som returnerer true, hvis en værdi er til stede. Dog foretrækkes ofte ifPresent(), da den kun udfører det angivne lambda-udtryk, hvis værdien eksisterer.
Main.java
123456789101112131415161718package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); if (productOpt.isPresent()) { System.out.println("Product found: " + productOpt.get()); } else { System.out.println("Product not found."); } // A more concise approach productOpt.ifPresent(product -> System.out.println("Product: " + product)); } }
I det første eksempel foretages en manuel kontrol for en værdi ved hjælp af isPresent() før kald af get(). Det andet eksempel fjerner behovet for en if-sætning ved at anvende et lambda-udtryk, der kun udføres, hvis produktet er til stede.
Angivelse af en standardværdi
Nogle gange, når en værdi mangler, er det en god idé at returnere et alternativ. Dette kan gøres med orElse(), som angiver en fallback-værdi. Hvis genereringen af fallback kræver beregning, er orElseGet() mere effektiv, da den kun udfører funktionen når det er nødvendigt.
Main.java
123456789101112131415package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElse("Default product"); System.out.println("Selected product: " + product); String productLazy = productOpt.orElseGet(() -> "Fallback product"); System.out.println("Selected product (lazy): " + productLazy); } }
Forskellen er, at orElse() altid opretter standardværdien, selv hvis den ikke er nødvendig, mens orElseGet() kun kalder den angivne funktion, hvis Optional er tom.
Kaste en undtagelse, hvis værdien mangler
I visse tilfælde er fraværet af en værdi en fejl. I sådanne situationer kan orElseThrow() anvendes til at kaste en undtagelse.
Main.java
123456789101112package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElseThrow(() -> new RuntimeException("Product not found")); System.out.println("Product: " + product); } }
Her, hvis Optional er tom, kaster programmet en RuntimeException. Dette er nyttigt, når en manglende værdi repræsenterer en kritisk fejl.
Transformering af værdier
Ofte indeholder en Optional komplekse objekter, men det kan være nødvendigt kun at arbejde med specifikke felter. I sådanne tilfælde anvendes map(), som anvender en angivet funktion, hvis en værdi er til stede.
Main.java
123456789101112package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable("Laptop"); Optional<Integer> nameLengthOpt = productOpt.map(String::length); nameLengthOpt.ifPresent(length -> System.out.println("Product name length: " + length)); } }
Hvis Optional er tom, returnerer map() blot Optional.empty(). Ellers anvender den String::length og returnerer en Optional<Integer>.
Filtrering af værdier
Nogle gange er det nødvendigt kun at beholde en værdi, hvis den opfylder en bestemt betingelse. Metoden filter() hjælper ved at bevare værdien, hvis den angivne prædikat returnerer true, eller returnere Optional.empty() hvis betingelsen ikke er opfyldt.
Main.java
123456789101112package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.of("Laptop"); Optional<String> filteredProductOpt = productOpt.filter(name -> name.length() > 5); filteredProductOpt.ifPresent(name -> System.out.println("Filtered product: " + name)); } }
Hvis strengens længde er større end 5, beholdes værdien; ellers bliver Optional tom.
1. Hvad sker der, hvis du kalder get() på en tom Optional?
2. Hvad vil denne kode udskrive?
3. Hvad bliver resultatet af følgende kode?
4. Hvilken metode er bedst til at angive en standardværdi, der kun beregnes, når det er nødvendigt?
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
What are some common methods provided by the Optional class?
Can you give examples of how to use Optional in Java?
Why is using Optional considered better than checking for null directly?
Awesome!
Completion rate improved to 2.33
Håndtering af Værdier med Optional-Klassen
Stryg for at vise menuen
I Java kan variabler, der gemmer objekter, indeholde en null-værdi. Dette fører ofte til NullPointerException, hvis null ikke håndteres korrekt. Disse fejl gør koden mindre pålidelig og sværere at vedligeholde. Her kommer Optional ind i billedet.
Tænk på det som en boks—den kan indeholde en værdi, eller den kan være tom. I stedet for at bruge if-sætninger til at tjekke for null, arbejder du med denne "boks" og bruger praktiske metoder til sikkert at hente værdien, hvis den findes.
Syntaks og brug af Optional
Hovedformålet med Optional er at undgå NullPointerException ved at erstatte standard if (value != null)-tjek med mere læsbare metoder.
Der er tre måder at oprette en Optional på:
Optional.empty()– opretter en tomOptionaluden værdi;Optional.of(value)– indkapsler det givne objekt, men kun hvis det med sikkerhed ikke er null;Optional.ofNullable(value)– indkapsler objektet, selv hvis det ernull, og opretter enten en fyldtOptionaleller en tom.
Main.java
123456789101112131415package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> emptyOpt = Optional.empty(); Optional<String> optWithValue = Optional.of("Laptop"); Optional<String> optNullable = Optional.ofNullable(null); System.out.println("Empty Optional: " + emptyOpt); System.out.println("Optional with value: " + optWithValue); System.out.println("Optional with null: " + optNullable); } }
Hvis du sender null til Optional.of(value), vil programmet kaste en NullPointerException, så ofNullable() bør altid bruges til potentielt tomme værdier.
Hentning af værdier fra Optional
For at udtrække en værdi fra en Optional, kan du bruge get()-metoden.
Main.java
12345678910package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> optWithValue = Optional.of("Laptop"); System.out.println("Final string: " + optWithValue.get()); } }
Her returnerer get() det faktiske objekt, der er gemt i Optional. Hvis Optional dog er tom (indeholder null), vil et kald til get() kaste en NoSuchElementException.
Kontrol af en værdi
Ved arbejde med Optional skal du kontrollere, om den indeholder en værdi. En måde at gøre dette på er med isPresent(), som returnerer true, hvis en værdi er til stede. Dog foretrækkes ofte ifPresent(), da den kun udfører det angivne lambda-udtryk, hvis værdien eksisterer.
Main.java
123456789101112131415161718package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); if (productOpt.isPresent()) { System.out.println("Product found: " + productOpt.get()); } else { System.out.println("Product not found."); } // A more concise approach productOpt.ifPresent(product -> System.out.println("Product: " + product)); } }
I det første eksempel foretages en manuel kontrol for en værdi ved hjælp af isPresent() før kald af get(). Det andet eksempel fjerner behovet for en if-sætning ved at anvende et lambda-udtryk, der kun udføres, hvis produktet er til stede.
Angivelse af en standardværdi
Nogle gange, når en værdi mangler, er det en god idé at returnere et alternativ. Dette kan gøres med orElse(), som angiver en fallback-værdi. Hvis genereringen af fallback kræver beregning, er orElseGet() mere effektiv, da den kun udfører funktionen når det er nødvendigt.
Main.java
123456789101112131415package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElse("Default product"); System.out.println("Selected product: " + product); String productLazy = productOpt.orElseGet(() -> "Fallback product"); System.out.println("Selected product (lazy): " + productLazy); } }
Forskellen er, at orElse() altid opretter standardværdien, selv hvis den ikke er nødvendig, mens orElseGet() kun kalder den angivne funktion, hvis Optional er tom.
Kaste en undtagelse, hvis værdien mangler
I visse tilfælde er fraværet af en værdi en fejl. I sådanne situationer kan orElseThrow() anvendes til at kaste en undtagelse.
Main.java
123456789101112package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElseThrow(() -> new RuntimeException("Product not found")); System.out.println("Product: " + product); } }
Her, hvis Optional er tom, kaster programmet en RuntimeException. Dette er nyttigt, når en manglende værdi repræsenterer en kritisk fejl.
Transformering af værdier
Ofte indeholder en Optional komplekse objekter, men det kan være nødvendigt kun at arbejde med specifikke felter. I sådanne tilfælde anvendes map(), som anvender en angivet funktion, hvis en værdi er til stede.
Main.java
123456789101112package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable("Laptop"); Optional<Integer> nameLengthOpt = productOpt.map(String::length); nameLengthOpt.ifPresent(length -> System.out.println("Product name length: " + length)); } }
Hvis Optional er tom, returnerer map() blot Optional.empty(). Ellers anvender den String::length og returnerer en Optional<Integer>.
Filtrering af værdier
Nogle gange er det nødvendigt kun at beholde en værdi, hvis den opfylder en bestemt betingelse. Metoden filter() hjælper ved at bevare værdien, hvis den angivne prædikat returnerer true, eller returnere Optional.empty() hvis betingelsen ikke er opfyldt.
Main.java
123456789101112package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.of("Laptop"); Optional<String> filteredProductOpt = productOpt.filter(name -> name.length() > 5); filteredProductOpt.ifPresent(name -> System.out.println("Filtered product: " + name)); } }
Hvis strengens længde er større end 5, beholdes værdien; ellers bliver Optional tom.
1. Hvad sker der, hvis du kalder get() på en tom Optional?
2. Hvad vil denne kode udskrive?
3. Hvad bliver resultatet af følgende kode?
4. Hvilken metode er bedst til at angive en standardværdi, der kun beregnes, når det er nødvendigt?
Tak for dine kommentarer!