Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Hantering av Värden med Klassen Optional | Terminaloperationer i Stream API
Stream API

bookHantering 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 tom Optional utan 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 är null, och skapar antingen en fylld 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); } }

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

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

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

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

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); } }

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

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); } }

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

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)); } }

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

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)); } }

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?

question mark

Vad händer om du anropar get() på en tom Optional?

Select the correct answer

question mark

Vad kommer denna kod att skriva ut?

Select the correct answer

question mark

Vad blir resultatet av följande kod?

Select the correct answer

question mark

Vilken metod är bäst för att tillhandahålla ett standardvärde som endast beräknas vid behov?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 5

Fråga AI

expand

Fråga AI

ChatGPT

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

bookHantering 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 tom Optional utan 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 är null, och skapar antingen en fylld 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); } }

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

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

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

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

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); } }

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

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); } }

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

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)); } }

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

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)); } }

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?

question mark

Vad händer om du anropar get() på en tom Optional?

Select the correct answer

question mark

Vad kommer denna kod att skriva ut?

Select the correct answer

question mark

Vad blir resultatet av följande kod?

Select the correct answer

question mark

Vilken metod är bäst för att tillhandahålla ett standardvärde som endast beräknas vid behov?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 5
some-alt