Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Håndtering af Værdier med Optional-Klassen | Section
Stream API i Java

bookHå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 tom Optional uden 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 er null, og opretter enten en fyldt Optional eller en tom.
Main.java

Main.java

copy
123456789101112131415
package 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 anvendes for potentielt tomme værdier.

Hentning af værdier fra Optional

For at udtrække en værdi fra en Optional, kan du bruge metoden get().

Main.java

Main.java

copy
12345678910
package 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() udløse en NoSuchElementException.

Kontrol af en værdi

Når du arbejder 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

Main.java

copy
123456789101112131415161718
package 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 kontrollerer du manuelt for en værdi ved at bruge isPresent() før du kalder get(). Det andet eksempel fjerner behovet for en if-sætning ved at anvende et lambda-udtryk, der kun kø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 giver 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

Main.java

copy
123456789101112131415
package 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

Main.java

copy
123456789101112
package 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

Main.java

copy
123456789101112
package 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

Main.java

copy
123456789101112
package 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 vil resultatet være af følgende kode?

4. Hvilken metode er bedst til at angive en standardværdi, der kun beregnes, når det er nødvendigt?

question mark

Hvad sker der, hvis du kalder get() på en tom Optional?

Select the correct answer

question mark

Hvad vil denne kode udskrive?

Select the correct answer

question mark

Hvad vil resultatet være af følgende kode?

Select the correct answer

question mark

Hvilken metode er bedst til at angive en standardværdi, der kun beregnes, når det er nødvendigt?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 1. Kapitel 31

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Sektion 1. Kapitel 31
some-alt