Sobes.tech
Middle

Ką žinote apie Optional klasę?

sobes.tech AI

Atsakymas iš AI

Optional<T> yra konteinerio klasė, kuri gali turėti arba ne tuščią reikšmę tipo T, arba būti tuščia. Ji buvo pridėta Java 8 siekiant spręsti null nuorodų problemą.

Pagrindiniai metodai:

  • of(T value): Sukuria Optional su ne tuščia reikšme. Meta NullPointerException, jei reikšmė null.
  • ofNullable(T value): Sukuria Optional su ne tuščia reikšme, jei ji yra, arba tuščią Optional, jei reikšmė null.
  • empty(): Sukuria tuščią Optional.
  • isPresent(): Grąžina true, jei reikšmė yra, kitaip false.
  • isEmpty(): Grąžina true, jei reikšmė nėra, kitaip false (pridėta Java 11).
  • get(): Grąžina reikšmę, jei ji yra, kitaip meta NoSuchElementException.
  • orElse(T other): Grąžina reikšmę, jei ji yra, kitaip other.
  • orElseGet(Supplier<? extends T> other): Grąžina reikšmę, jei ji yra, kitaip vykdo Supplier ir grąžina jo rezultatą. Pirmenybė teikiama orElse(T other) esant brangiai inicializacijai.
  • orElseThrow(Supplier<? extends X> exceptionSupplier): Grąžina reikšmę, jei ji yra, kitaip meta išimtį, kurią pateikia exceptionSupplier.

Pavyzdys, kaip išvengti NullPointerException:

// Vietoje
User user = findUserById(userId);
if (user != null) {
    String email = user.getEmail();
    // ...
}

// Galima naudoti Optional
Optional<User> userOptional = findUserByIdOptional(userId);
userOptional.ifPresent(user -> {
    String email = user.getEmail();
    // ...
});

Lyginant orElse ir orElseGet:

// Abu iškvietimai grąžins DefaultUser, jei optionalUser yra tuščias
// Bet `orElse` atveju, `new DefaultUser()` bus iškviečiamas visada,
// net jei optionalUser turi reikšmę
User user1 = optionalUser.orElse(new DefaultUser());

// `orElseGet` atveju, `new DefaultUser()` bus iškviečiamas tik
// jei optionalUser yra tuščias
User user2 = optionalUser.orElseGet(() -> new DefaultUser());

Optional padeda padaryti kodą aiškesnį ir saugesnį, aiškiai nurodant, kad reikšmė gali būti nebūtina. Jo nereikėtų naudoti kaip klasių laukų ar metodų parametrų, jei trūkstama reikšmė yra išimtis.