Umgang mit Werten mit der Optional-Klasse
Swipe um das Menü anzuzeigen
In Java können Variablen, die Objekte speichern, den Wert null enthalten. Dies führt häufig zu einer NullPointerException, wenn null nicht korrekt behandelt wird. Solche Fehler machen den Code weniger zuverlässig und schwerer wartbar. Hier kommt Optional ins Spiel.
Man kann sich Optional als eine Box vorstellen – sie kann einen Wert enthalten oder leer sein. Anstatt mit if-Anweisungen auf null zu prüfen, arbeitet man mit dieser „Box“ und verwendet praktische Methoden, um den Wert sicher abzurufen, falls er existiert.
Syntax und Verwendung von Optional
Das Hauptziel von Optional ist es, NullPointerException zu vermeiden, indem Standardprüfungen wie if (value != null) durch lesbarere Methoden ersetzt werden.
Es gibt drei Möglichkeiten, ein Optional zu erstellen:
Optional.empty()– erzeugt ein leeresOptionalohne Wert;Optional.of(value)– umschließt das angegebene Objekt, jedoch nur, wenn garantiert ist, dass es nicht null ist;Optional.ofNullable(value)– umschließt das Objekt, auch wenn esnullist, und erstellt so entweder ein gefülltes oder ein leeresOptional.
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); } }
Wenn null an Optional.of(value) übergeben wird, wirft das Programm eine NullPointerException. Daher sollte ofNullable() immer für möglicherweise leere Werte verwendet werden.
Werte aus Optional abrufen
Zum Extrahieren eines Wertes aus einem Optional kann die Methode get() verwendet werden.
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()); } }
Hier gibt get() das tatsächlich gespeicherte Objekt im Optional zurück. Ist das Optional jedoch leer (enthält null), wird eine get() geworfen, wenn NoSuchElementException aufgerufen wird.
Überprüfen auf einen Wert
Beim Arbeiten mit Optional muss geprüft werden, ob ein Wert enthalten ist. Eine Möglichkeit hierfür ist isPresent(), das true zurückgibt, wenn ein Wert vorhanden ist. Häufig wird jedoch ifPresent() bevorzugt, da damit ein bereitgestellter Lambda-Ausdruck nur dann ausgeführt wird, wenn der Wert existiert.
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)); } }
Im ersten Beispiel erfolgt eine manuelle Überprüfung auf einen Wert mit isPresent(), bevor get() aufgerufen wird. Das zweite Beispiel verzichtet auf eine if-Anweisung, indem eine Lambda-Ausdruck verwendet wird, der nur ausgeführt wird, wenn das Produkt vorhanden ist.
Bereitstellung eines Standardwerts
Manchmal ist es sinnvoll, bei fehlendem Wert eine Alternative zurückzugeben. Dies kann mit orElse() erfolgen, das einen Ersatzwert bereitstellt. Falls die Erzeugung des Ersatzwerts eine Berechnung erfordert, ist orElseGet() effizienter, da die Funktion nur bei Bedarf ausgeführt wird.
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); } }
Der Unterschied besteht darin, dass orElse() immer den Fallback-Wert erstellt, auch wenn er nicht benötigt wird, während orElseGet() die bereitgestellte Funktion nur aufruft, wenn das Optional leer ist.
Auslösen einer Ausnahme, wenn ein Wert fehlt
In einigen Fällen stellt das Fehlen eines Wertes einen Fehler dar. In solchen Situationen kann orElseThrow() verwendet werden, um eine Ausnahme zu werfen.
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); } }
Hier wirft das Programm eine Optional, wenn das RuntimeException leer ist. Dies ist nützlich, wenn ein fehlender Wert einen kritischen Fehler darstellt.
Werte transformieren
Häufig enthält ein Optional komplexe Objekte, aber es wird nur mit bestimmten Feldern gearbeitet. In solchen Fällen wird map() verwendet, das eine angegebene Funktion anwendet, falls ein Wert vorhanden ist.
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)); } }
Wenn das Optional leer ist, gibt map() einfach Optional.empty() zurück. Andernfalls wird String::length angewendet und ein Optional<Integer> zurückgegeben.
Werte filtern
Manchmal ist es erforderlich, einen Wert nur dann zu behalten, wenn er eine bestimmte Bedingung erfüllt. Die Methode filter() hilft, indem sie den Wert beibehält, wenn das angegebene Prädikat true zurückgibt, oder andernfalls Optional.empty() zurückgibt, wenn die Bedingung nicht erfüllt ist.
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)); } }
Wenn die Länge des Strings größer als 5 ist, wird der Wert beibehalten; andernfalls wird das Optional leer.
1. Was passiert, wenn Sie get() bei einem leeren Optional aufrufen?
2. Was gibt dieser Code aus?
3. Was ist das Ergebnis des folgenden Codes?
4. Welche Methode eignet sich am besten, um einen Standardwert bereitzustellen, der nur bei Bedarf berechnet wird?
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen