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 | Terminale Operationer i Stream API'et
Stream API

bookHå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 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 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

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() 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

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 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

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 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?

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 bliver resultatet 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 3. Kapitel 5

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

Suggested prompts:

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

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 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

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() 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

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 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

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 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?

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 bliver resultatet 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 3. Kapitel 5
some-alt