Middle
Čo viete o triede Optional?
sobes.tech AI
Odpoveď od AI
Optional<T> je kontajnerová trieda, ktorá môže obsahovať buď ne-prázdnu hodnotu typu T, alebo byť prázdna. Bola pridaná v Jave 8 na riešenie problému null-ukazovateľov.
Hlavné metódy:
of(T value): VytváraOptionals ne-prázdnou hodnotou. VyhodíNullPointerException, ak je hodnotanull.ofNullable(T value): VytváraOptionals ne-prázdnou hodnotou, ak je k dispozícii, alebo prázdnyOptional, ak je hodnotanull.empty(): Vytvára prázdnyOptional.isPresent(): Vrátitrue, ak je hodnota prítomná, inakfalse.isEmpty(): Vrátitrue, ak hodnota chýba, inakfalse(pridané v Jave 11).get(): Vráti hodnotu, ak je prítomná, inak vyhodíNoSuchElementException.orElse(T other): Vráti hodnotu, ak je prítomná, inak vrátiother.orElseGet(Supplier<? extends T> other): Vráti hodnotu, ak je prítomná, inak vykonáSuppliera vráti jeho výsledok. Preferované predorElse(T other)pri nákladnej inicializáciiother.orElseThrow(Supplier<? extends X> exceptionSupplier): Vráti hodnotu, ak je prítomná, inak vyhodí výnimku, ktorú poskytneexceptionSupplier.
Príklad použitia na zabránenie NullPointerException:
// Namiesto
User user = findUserById(userId);
if (user != null) {
String email = user.getEmail();
// ...
}
// Môžete použiť Optional
Optional<User> userOptional = findUserByIdOptional(userId);
userOptional.ifPresent(user -> {
String email = user.getEmail();
// ...
});
Porovnanie orElse a orElseGet:
// Oba volania vrátia DefaultUser, ak je optionalUser prázdny
// Ale v prípade orElse bude `new DefaultUser()` vždy volané,
// aj keď optionalUser obsahuje hodnotu
User user1 = optionalUser.orElse(new DefaultUser());
// V prípade orElseGet bude `new DefaultUser()` volané
// iba ak je optionalUser prázdny
User user2 = optionalUser.orElseGet(() -> new DefaultUser());
Optional pomáha spraviť kód čitateľnejším a bezpečnejším, jasne naznačuje, že hodnota môže chýbať. Nemal by sa používať pre polia tried alebo parametre metód, ak chýbajúca hodnota je výnimočná situácia.