Middle
Ce știi despre clasa Optional?
sobes.tech AI
Răspuns de la AI
Optional<T> este o clasă container care poate conține o valoare nenul de tip T sau poate fi goală. A fost adăugată în Java 8 pentru a rezolva problema pointerilor null.
Metode principale:
of(T value): Creează unOptionalcu o valoare nenulă. AruncăNullPointerExceptiondacă valoarea estenull.ofNullable(T value): Creează unOptionalcu o valoare nenulă dacă aceasta există, sau unOptionalgol dacă valoarea estenull.empty(): Creează unOptionalgol.isPresent(): Returneazătruedacă valoarea este prezentă, altfelfalse.isEmpty(): Returneazătruedacă valoarea lipsește, altfelfalse(adăugat în Java 11).get(): Returnează valoarea dacă este prezentă, altfel aruncăNoSuchElementException.orElse(T other): Returnează valoarea dacă este prezentă, altfelother.orElseGet(Supplier<? extends T> other): Returnează valoarea dacă este prezentă, altfel execută și returnează rezultatulSupplier. Este preferabil față deorElse(T other)atunci când inițializarea luiothereste costisitoare.orElseThrow(Supplier<? extends X> exceptionSupplier): Returnează valoarea dacă este prezentă, altfel aruncă excepția furnizată deexceptionSupplier.
Exemplu de utilizare pentru evitarea NullPointerException:
// În loc de
User user = findUserById(userId);
if (user != null) {
String email = user.getEmail();
// ...
}
// Se poate folosi Optional
Optional<User> userOptional = findUserByIdOptional(userId);
userOptional.ifPresent(user -> {
String email = user.getEmail();
// ...
});
Compararea orElse și orElseGet:
// Ambele apeluri vor returna DefaultUser dacă optionalUser este gol
// Dar în cazul lui `orElse`, `new DefaultUser()` va fi întotdeauna apelat,
// chiar dacă optionalUser conține o valoare
User user1 = optionalUser.orElse(new DefaultUser());
// În cazul lui `orElseGet`, `new DefaultUser()` va fi apelat doar
// dacă optionalUser este gol
User user2 = optionalUser.orElseGet(() -> new DefaultUser());
Optional ajută la face codul mai lizibil și mai sigur, indicând clar că valoarea poate lipsi. Nu trebuie folosit pentru câmpuri de clasă sau parametri de metode dacă lipsa valorii este o situație excepțională.