Middle
Wat weet je over de klasse Optional?
sobes.tech AI
Antwoord van AI
Optional<T> is een containerklasse die ofwel een niet-lege waarde van type T kan bevatten, of leeg kan zijn. Het is toegevoegd in Java 8 om het probleem van null-waarden op te lossen.
Belangrijkste methoden:
of(T value): Maakt eenOptionalmet een niet-lege waarde. GooiNullPointerExceptionals de waardenullis.ofNullable(T value): Maakt eenOptionalmet een niet-lege waarde als die bestaat, of een legeOptionalals de waardenullis.empty(): Maakt een legeOptional.isPresent(): Geefttrueterug als de waarde aanwezig is, andersfalse.isEmpty(): Geefttrueterug als de waarde afwezig is, andersfalse(toegevoegd in Java 11).get(): Geeft de waarde terug als die aanwezig is, anders gooit hetNoSuchElementException.orElse(T other): Geeft de waarde terug als die aanwezig is, andersother.orElseGet(Supplier<? extends T> other): Geeft de waarde terug als die aanwezig is, anders voert het deSupplieruit en geeft het resultaat terug. Voorkeur bovenorElse(T other)wanneer de initialisatie vanotherkostbaar is.orElseThrow(Supplier<? extends X> exceptionSupplier): Geeft de waarde terug als die aanwezig is, anders gooit het de doorexceptionSuppliergeleverde uitzondering.
Voorbeeld om NullPointerException te voorkomen:
// In plaats van
User user = findUserById(userId);
if (user != null) {
String email = user.getEmail();
// ...
}
// Kan Optional gebruiken
Optional<User> userOptional = findUserByIdOptional(userId);
userOptional.ifPresent(user -> {
String email = user.getEmail();
// ...
});
Vergelijking orElse en orElseGet:
// Beide aanroepen geven DefaultUser terug als optionalUser leeg is
// Maar in het geval van `orElse`, wordt `new DefaultUser()` altijd aangeroepen,
// zelfs als optionalUser een waarde bevat
User user1 = optionalUser.orElse(new DefaultUser());
// In het geval van `orElseGet`, wordt `new DefaultUser()` alleen aangeroepen
// als optionalUser leeg is
User user2 = optionalUser.orElseGet(() -> new DefaultUser());
Optional helpt de code leesbaarder en veiliger te maken, door expliciet aan te geven dat de waarde afwezig kan zijn. Het moet niet worden gebruikt voor klassevelden of methodenparameters als het ontbreken van de waarde een uitzonderingssituatie is.