Sobes.tech
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ă un Optional cu o valoare nenulă. Aruncă NullPointerException dacă valoarea este null.
  • ofNullable(T value): Creează un Optional cu o valoare nenulă dacă aceasta există, sau un Optional gol dacă valoarea este null.
  • empty(): Creează un Optional gol.
  • isPresent(): Returnează true dacă valoarea este prezentă, altfel false.
  • isEmpty(): Returnează true dacă valoarea lipsește, altfel false (adăugat în Java 11).
  • get(): Returnează valoarea dacă este prezentă, altfel aruncă NoSuchElementException.
  • orElse(T other): Returnează valoarea dacă este prezentă, altfel other.
  • orElseGet(Supplier<? extends T> other): Returnează valoarea dacă este prezentă, altfel execută și returnează rezultatul Supplier. Este preferabil față de orElse(T other) atunci când inițializarea lui other este costisitoare.
  • orElseThrow(Supplier<? extends X> exceptionSupplier): Returnează valoarea dacă este prezentă, altfel aruncă excepția furnizată de exceptionSupplier.

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ă.