Java 8 Optional onder de knie krijgen: Praktische gids voor null-veilige code
Optional is een container-object dat gebruikt wordt om niet-null objecten te bevatten. Een Optional-object vertegenwoordigt een afwezige waarde in plaats van null. Deze klasse biedt diverse hulpmethoden om waarden te hanteren als 'beschikbaar' of 'niet beschikbaar' in plaats van null-controles uit te voeren. Het is geïntroduceerd in Java 8 en lijkt op wat Optional is in Guava.
Klassedeclaratie
Hieronder volgt de declaratie voor de java.util.Optional<T> klasse:
public final class Optional<T> extends Object
Klassemethoden
| Nr. | Methode & Beschrijving |
|---|---|
| 1 | static <T> Optional<T> empty() Geeft een lege Optional-instantie terug. |
| 2 | boolean equals(Object obj) Geeft aan of een ander object "gelijk is aan" deze Optional. |
| 3 | Optional<T> filter(Predicate<? super T> predicate) Als een waarde aanwezig is en voldoet aan het gegeven predicaat, retourneert het een Optional die de waarde beschrijft, anders een lege Optional. |
| 4 | <U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) Als een waarde aanwezig is, past het de meegeleverde Optionale mapping-functie toe en geeft het resultaat terug, anders een lege Optional. |
| 5 | T get() Als een waarde aanwezig is in deze Optional, geeft het de waarde terug, anders gooit het een NoSuchElementException. |
| 6 | int hashCode() Geeft de hashcode van de aanwezige waarde terug, of 0 als geen waarde aanwezig is. |
| 7 | void ifPresent(Consumer<? super T> consumer) Als een waarde aanwezig is, roept het de gespecifieerde consumer aan met de waarde, anders doet het niets. |
| 8 | boolean isPresent() Geeft true terug als er een waarde aanwezig is, anders false. |
| 9 | <U> Optional<U> map(Function<? super T, ? extends U> mapper) Als een waarde aanwezig is, past het de mapping-functie toe en geeft, als het resultaat niet-null is, een Optional terug die het resultaat beschrijft. |
| 10 | static <T> Optional<T> of(T value) Geeft een Optional terug met de gespecifieerde niet-null waarde. |
| 11 | static <T> Optional<T> ofNullable(T value) Geeft een Optional terug die de gespecifieerde waarde beschrijft als deze niet-null is, anders een lege Optional. |
| 12 | T orElse(T other) Geeft de waarde terug als deze aanwezig is, anders geeft het de andere waarde terug. |
| 13 | T orElseGet(Supplier<? extends T> other) Geeft de waarde terug als deze aanwezig is, anders roept het de supplier aan en geeft het resultaat terug. |
| 14 | <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) Geeft de bevatwaarde terug als deze aanwezig is, anders gooit het een exception die wordt aangemaakt door de supplier. |
| 15 | String toString() Geeft een niet-lege stringrepresentatie van deze Optional terug, geschikt voor debugging. |
Deze klasse overerft methoden van de volgende klasse:
- java.lang.Object
Optional Voorbeeld
Maak het volgende Java-programma aan met een editor naar keuze in, zeg, C:\> JAVA.
Java8Tester.java
Live Demoimport java.util.Optional;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8Tester = new Java8Tester();
Integer value1 = null;
Integer value2 = new Integer(10);
// Optional.ofNullable - staat toe dat de parameter null is
Optional<Integer> a = Optional.ofNullable(value1);
// Optional.of - gooit NullPointerException als parameter null is
Optional<Integer> b = Optional.of(value2);
System.out.println(java8Tester.sum(a, b));
}
public Integer sum(Optional<Integer> a, Optional<Integer> b) {
// Optional.isPresent - controleert of de waarde aanwezig is
System.out.println("Eerste parameter is aanwezig: " + a.isPresent());
System.out.println("Tweede parameter is aanwezig: " + b.isPresent());
// Optional.orElse - geeft de waarde terug als aanwezig, anders de standaardwaarde
Integer value1 = a.orElse(new Integer(0));
// Optional.get - haalt de waarde op, waarde moet aanwezig zijn
Integer value2 = b.get();
return value1 + value2;
}
}
Resultaat Verifiëren
Compileer de klasse met de javac compiler als volgt:
C:\JAVA>javac Java8Tester.java
Voer nu de Java8Tester uit als volgt:
C:\JAVA>java Java8Tester
Het zou de volgende output moeten produceren:
Eerste parameter is aanwezig: false Tweede parameter is aanwezig: true 10
Java
- Java's final-sleutelwoord begrijpen: variabelen, methoden en klassen
- Java instanceof operator: een uitgebreide gids
- Java-erfenis meesteren: concepten, typen en praktische voorbeelden
- Java geneste static classes begrijpen: gebruik, verschillen en voorbeelden
- Java anonieme inner classes meesteren: definitie, syntax en praktische voorbeelden
- Java Singleton patroon uitgelegd: hoe veilig te implementeren en gebruiken
- Java Reflectie meesteren: klassen, methoden en velden inspecteren tijdens runtime
- Java ObjectOutputStream: Serialisatie, methoden en praktische voorbeelden
- Java Generics: Herbruikbare, type-veilige code bouwen
- Java-bestandsbewerkingen onder de knie krijgen met java.io – Aanmaken, lezen, schrijven en verwijderen
- Java 9: Nieuwe features voor de Optional-klasse