Håndtering av Verdier med Optional-klassen
I Java kan variabler som lagrer objekter ha verdien null. Dette fører ofte til NullPointerException hvis null ikke håndteres riktig. Slike feil gjør koden mindre pålitelig og vanskeligere å vedlikeholde. Det er her Optional kommer inn.
Tenk på det som en boks—den kan inneholde en verdi, eller den kan være tom. I stedet for å bruke if-setninger for å sjekke etter null, arbeider du med denne "boksen" og bruker praktiske metoder for å trygt hente ut verdien hvis den finnes.
Syntaks og bruk av Optional
Hovedmålet med Optional er å unngå NullPointerException ved å erstatte vanlige if (value != null)-sjekker med mer lesbare metoder.
Det finnes tre måter å opprette en Optional på:
Optional.empty()– oppretter en tomOptionaluten verdi;Optional.of(value)– pakker inn det gitte objektet, men kun hvis det er garantert å være ikke-null;Optional.ofNullable(value)– pakker inn objektet, selv om det ernull, og oppretter enten en fyltOptionaleller 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 alltid brukes for potensielt tomme verdier.
Hente verdier fra Optional
For å hente ut en verdi fra en Optional, kan du bruke 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 objektet som er lagret i Optional. Dersom Optional er tom (inneholder null), vil et kall på get() kaste en NoSuchElementException.
Sjekke etter en verdi
Når du arbeider med Optional, må du sjekke om den inneholder en verdi. Én måte å gjøre dette på er med isPresent(), som returnerer true hvis en verdi er til stede. Ofte foretrekkes imidlertid ifPresent(), da denne utfører et gitt lambda-uttrykk kun hvis verdien 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 eksempelet sjekker du manuelt etter en verdi ved å bruke isPresent() før du kaller get(). Det andre eksempelet fjerner behovet for en if-setning ved å bruke et lambda-uttrykk som kun kjøres hvis produktet er til stede.
Tilby et standardverdi
Noen ganger, når en verdi mangler, kan det være lurt å returnere et alternativ. Dette kan gjøres med orElse(), som gir en reserveverdi. Hvis det kreves beregning for å generere reserveverdien, er orElseGet() mer effektiv, siden funksjonen kun kjøres når det er nødvendig.
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); } }
Forskjellen er at orElse() alltid oppretter reserveverdien, selv om den ikke trengs, mens orElseGet() kun kaller den oppgitte funksjonen hvis Optional er tom.
Kaste et unntak hvis verdi mangler
I noen tilfeller er fravær av en verdi en feil. I slike situasjoner kan orElseThrow() brukes for å kaste et unntak.
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, vil programmet kaste en RuntimeException. Dette er nyttig når en manglende verdi representerer en kritisk feil.
Transformere verdier
Ofte inneholder en Optional komplekse objekter, men det kan være behov for å arbeide med spesifikke felt. I slike tilfeller brukes map(), som anvender en gitt funksjon dersom en verdi 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() ganske enkelt Optional.empty(). Ellers anvender den String::length og returnerer en Optional<Integer>.
Filtrering av verdier
Noen ganger er det nødvendig å beholde en verdi bare hvis den oppfyller en bestemt betingelse. Metoden filter() hjelper ved å beholde verdien hvis den gitte predikaten returnerer true, eller returnere Optional.empty() hvis betingelsen ikke er oppfylt.
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 lengde er større enn 5, blir verdien beholdt; ellers blir Optional tom.
1. Hva skjer hvis du kaller get() på en tom Optional?
2. Hva vil denne koden skrive ut?
3. Hva blir resultatet av følgende kode?
4. Hvilken metode er best for å gi en standardverdi som kun beregnes ved behov?
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
Awesome!
Completion rate improved to 2.33
Håndtering av Verdier med Optional-klassen
Sveip for å vise menyen
I Java kan variabler som lagrer objekter ha verdien null. Dette fører ofte til NullPointerException hvis null ikke håndteres riktig. Slike feil gjør koden mindre pålitelig og vanskeligere å vedlikeholde. Det er her Optional kommer inn.
Tenk på det som en boks—den kan inneholde en verdi, eller den kan være tom. I stedet for å bruke if-setninger for å sjekke etter null, arbeider du med denne "boksen" og bruker praktiske metoder for å trygt hente ut verdien hvis den finnes.
Syntaks og bruk av Optional
Hovedmålet med Optional er å unngå NullPointerException ved å erstatte vanlige if (value != null)-sjekker med mer lesbare metoder.
Det finnes tre måter å opprette en Optional på:
Optional.empty()– oppretter en tomOptionaluten verdi;Optional.of(value)– pakker inn det gitte objektet, men kun hvis det er garantert å være ikke-null;Optional.ofNullable(value)– pakker inn objektet, selv om det ernull, og oppretter enten en fyltOptionaleller 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 alltid brukes for potensielt tomme verdier.
Hente verdier fra Optional
For å hente ut en verdi fra en Optional, kan du bruke 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 objektet som er lagret i Optional. Dersom Optional er tom (inneholder null), vil et kall på get() kaste en NoSuchElementException.
Sjekke etter en verdi
Når du arbeider med Optional, må du sjekke om den inneholder en verdi. Én måte å gjøre dette på er med isPresent(), som returnerer true hvis en verdi er til stede. Ofte foretrekkes imidlertid ifPresent(), da denne utfører et gitt lambda-uttrykk kun hvis verdien 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 eksempelet sjekker du manuelt etter en verdi ved å bruke isPresent() før du kaller get(). Det andre eksempelet fjerner behovet for en if-setning ved å bruke et lambda-uttrykk som kun kjøres hvis produktet er til stede.
Tilby et standardverdi
Noen ganger, når en verdi mangler, kan det være lurt å returnere et alternativ. Dette kan gjøres med orElse(), som gir en reserveverdi. Hvis det kreves beregning for å generere reserveverdien, er orElseGet() mer effektiv, siden funksjonen kun kjøres når det er nødvendig.
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); } }
Forskjellen er at orElse() alltid oppretter reserveverdien, selv om den ikke trengs, mens orElseGet() kun kaller den oppgitte funksjonen hvis Optional er tom.
Kaste et unntak hvis verdi mangler
I noen tilfeller er fravær av en verdi en feil. I slike situasjoner kan orElseThrow() brukes for å kaste et unntak.
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, vil programmet kaste en RuntimeException. Dette er nyttig når en manglende verdi representerer en kritisk feil.
Transformere verdier
Ofte inneholder en Optional komplekse objekter, men det kan være behov for å arbeide med spesifikke felt. I slike tilfeller brukes map(), som anvender en gitt funksjon dersom en verdi 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() ganske enkelt Optional.empty(). Ellers anvender den String::length og returnerer en Optional<Integer>.
Filtrering av verdier
Noen ganger er det nødvendig å beholde en verdi bare hvis den oppfyller en bestemt betingelse. Metoden filter() hjelper ved å beholde verdien hvis den gitte predikaten returnerer true, eller returnere Optional.empty() hvis betingelsen ikke er oppfylt.
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 lengde er større enn 5, blir verdien beholdt; ellers blir Optional tom.
1. Hva skjer hvis du kaller get() på en tom Optional?
2. Hva vil denne koden skrive ut?
3. Hva blir resultatet av følgende kode?
4. Hvilken metode er best for å gi en standardverdi som kun beregnes ved behov?
Takk for tilbakemeldingene dine!