Hantering av Värden med Klassen Optional
I Java kan variabler som lagrar objekt ha värdet null. Detta leder ofta till NullPointerException om null inte hanteras korrekt. Sådana fel gör koden mindre pålitlig och svårare att underhålla. Här kommer Optional in i bilden.
Tänk på det som en låda—den kan innehålla ett värde, eller vara tom. Istället för att använda if-satser för att kontrollera null, arbetar du med denna "låda" och använder praktiska metoder för att säkert hämta värdet om det finns.
Syntax och användning av Optional
Huvudsyftet med Optional är att undvika NullPointerException genom att ersätta vanliga if (value != null)-kontroller med mer läsbara metoder.
Det finns tre sätt att skapa en Optional:
Optional.empty()– skapar en tomOptionalutan värde;Optional.of(value)– kapslar in det angivna objektet, men endast om det garanterat inte är null;Optional.ofNullable(value)– kapslar in objektet, även om det ärnull, och skapar antingen en fylldOptionaleller 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); } }
Om du skickar null till Optional.of(value), kommer programmet att kasta ett NullPointerException, så ofNullable() bör alltid användas för potentiellt tomma värden.
Hämta värden från Optional
För att extrahera ett värde från en Optional kan du använda metoden get().
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()); } }
Här returnerar get() det faktiska objektet som lagras i Optional. Om Optional däremot är tom (innehåller null), kommer ett anrop på get() att kasta ett NoSuchElementException.
Kontrollera om ett värde finns
Vid arbete med Optional behöver du kontrollera om det innehåller ett värde. Ett sätt att göra detta är med isPresent(), som returnerar true om ett värde finns. Dock föredras ofta ifPresent(), eftersom det utför ett angivet lambda-uttryck endast om värdet existerar.
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örsta exemplet kontrolleras värdet manuellt med isPresent() innan get() anropas. Det andra exemplet eliminerar behovet av en if-sats genom att använda ett lambda-uttryck som endast körs om produkten finns.
Ange ett standardvärde
Ibland, när ett värde saknas, är det lämpligt att returnera ett alternativ. Detta kan göras med orElse(), som tillhandahåller ett reservvärde. Om genereringen av reservvärdet kräver beräkning är orElseGet() mer effektivt, eftersom funktionen endast körs vid behov.
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); } }
Skillnaden är att orElse() alltid skapar reservvärdet, även om det inte behövs, medan orElseGet() anropar den angivna funktionen endast om Optional är tom.
Kasta ett undantag om värde saknas
I vissa fall är avsaknaden av ett värde ett fel. I sådana situationer kan orElseThrow() användas för att kasta ett undantag.
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); } }
Här, om Optional är tom, kastar programmet ett RuntimeException. Detta är användbart när ett saknat värde representerar ett kritiskt fel.
Transformera värden
Ofta innehåller en Optional komplexa objekt, men det kan vara så att endast specifika fält behöver användas. I sådana fall används map(), som tillämpar en angiven funktion om ett värde finns.
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)); } }
Om Optional är tom, returnerar map() helt enkelt Optional.empty(). Annars tillämpar den String::length och returnerar en Optional<Integer>.
Filtrering av värden
Ibland behöver du behålla ett värde endast om det uppfyller ett visst villkor. Metoden filter() hjälper till genom att behålla värdet om det angivna predikatet returnerar true eller returnera Optional.empty() om villkoret inte är uppfyllt.
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)); } }
Om strängens längd är större än 5, behålls värdet; annars blir Optional tom.
1. Vad händer om du anropar get() på en tom Optional?
2. Vad kommer denna kod att skriva ut?
3. Vad blir resultatet av följande kod?
4. Vilken metod är bäst för att tillhandahålla ett standardvärde som endast beräknas vid behov?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Awesome!
Completion rate improved to 2.33
Hantering av Värden med Klassen Optional
Svep för att visa menyn
I Java kan variabler som lagrar objekt ha värdet null. Detta leder ofta till NullPointerException om null inte hanteras korrekt. Sådana fel gör koden mindre pålitlig och svårare att underhålla. Här kommer Optional in i bilden.
Tänk på det som en låda—den kan innehålla ett värde, eller vara tom. Istället för att använda if-satser för att kontrollera null, arbetar du med denna "låda" och använder praktiska metoder för att säkert hämta värdet om det finns.
Syntax och användning av Optional
Huvudsyftet med Optional är att undvika NullPointerException genom att ersätta vanliga if (value != null)-kontroller med mer läsbara metoder.
Det finns tre sätt att skapa en Optional:
Optional.empty()– skapar en tomOptionalutan värde;Optional.of(value)– kapslar in det angivna objektet, men endast om det garanterat inte är null;Optional.ofNullable(value)– kapslar in objektet, även om det ärnull, och skapar antingen en fylldOptionaleller 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); } }
Om du skickar null till Optional.of(value), kommer programmet att kasta ett NullPointerException, så ofNullable() bör alltid användas för potentiellt tomma värden.
Hämta värden från Optional
För att extrahera ett värde från en Optional kan du använda metoden get().
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()); } }
Här returnerar get() det faktiska objektet som lagras i Optional. Om Optional däremot är tom (innehåller null), kommer ett anrop på get() att kasta ett NoSuchElementException.
Kontrollera om ett värde finns
Vid arbete med Optional behöver du kontrollera om det innehåller ett värde. Ett sätt att göra detta är med isPresent(), som returnerar true om ett värde finns. Dock föredras ofta ifPresent(), eftersom det utför ett angivet lambda-uttryck endast om värdet existerar.
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örsta exemplet kontrolleras värdet manuellt med isPresent() innan get() anropas. Det andra exemplet eliminerar behovet av en if-sats genom att använda ett lambda-uttryck som endast körs om produkten finns.
Ange ett standardvärde
Ibland, när ett värde saknas, är det lämpligt att returnera ett alternativ. Detta kan göras med orElse(), som tillhandahåller ett reservvärde. Om genereringen av reservvärdet kräver beräkning är orElseGet() mer effektivt, eftersom funktionen endast körs vid behov.
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); } }
Skillnaden är att orElse() alltid skapar reservvärdet, även om det inte behövs, medan orElseGet() anropar den angivna funktionen endast om Optional är tom.
Kasta ett undantag om värde saknas
I vissa fall är avsaknaden av ett värde ett fel. I sådana situationer kan orElseThrow() användas för att kasta ett undantag.
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); } }
Här, om Optional är tom, kastar programmet ett RuntimeException. Detta är användbart när ett saknat värde representerar ett kritiskt fel.
Transformera värden
Ofta innehåller en Optional komplexa objekt, men det kan vara så att endast specifika fält behöver användas. I sådana fall används map(), som tillämpar en angiven funktion om ett värde finns.
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)); } }
Om Optional är tom, returnerar map() helt enkelt Optional.empty(). Annars tillämpar den String::length och returnerar en Optional<Integer>.
Filtrering av värden
Ibland behöver du behålla ett värde endast om det uppfyller ett visst villkor. Metoden filter() hjälper till genom att behålla värdet om det angivna predikatet returnerar true eller returnera Optional.empty() om villkoret inte är uppfyllt.
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)); } }
Om strängens längd är större än 5, behålls värdet; annars blir Optional tom.
1. Vad händer om du anropar get() på en tom Optional?
2. Vad kommer denna kod att skriva ut?
3. Vad blir resultatet av följande kod?
4. Vilken metod är bäst för att tillhandahålla ett standardvärde som endast beräknas vid behov?
Tack för dina kommentarer!