Sobes.tech
Middle

Mit tud az Optional osztályról?

sobes.tech MI

Válasz az MI-től

Az Optional<T> egy konténerosztály, amely vagy tartalmaz egy nem null értéket típusból T, vagy üres. Java 8-ban adták hozzá a null-értékek problémájának megoldására.

Főbb módszerek:

  • of(T value): Létrehoz egy Optional-t nem null értékkel. NullPointerException-t dob, ha az érték null.
  • ofNullable(T value): Létrehoz egy Optional-t nem null értékkel, ha van, vagy üres Optional-t, ha az érték null.
  • empty(): Üres Optional-t hoz létre.
  • isPresent(): Igazat ad vissza, ha az érték jelen van, különben hamisat.
  • isEmpty(): Igazat ad vissza, ha az érték hiányzik, különben hamisat (Java 11-től hozzáadva).
  • get(): Visszaadja az értéket, ha jelen van, különben NoSuchElementException-t dob.
  • orElse(T other): Visszaadja az értéket, ha jelen van, különben other-t.
  • orElseGet(Supplier<? extends T> other): Visszaadja az értéket, ha jelen van, különben végrehajtja és visszaadja a Supplier eredményét. Előnyösebb, mint az orElse(T other), ha az other inicializálása költséges.
  • orElseThrow(Supplier<? extends X> exceptionSupplier): Visszaadja az értéket, ha jelen van, különben kivételt dob, amit az exceptionSupplier szolgáltat.

Példa a NullPointerException elkerülésére:

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

// Használhatunk Optional-t
Optional<User> userOptional = findUserByIdOptional(userId);
userOptional.ifPresent(user -> {
    String email = user.getEmail();
    // ...
});

Az orElse és az orElseGet összehasonlítása:

// Mindkét hívás visszaadja a DefaultUser-t, ha az optionalUser üres
// De az `orElse` esetén a `new DefaultUser()` mindig meghívódik,
// még akkor is, ha az optionalUser értéket tartalmaz
User user1 = optionalUser.orElse(new DefaultUser());

// Az `orElseGet` esetén a `new DefaultUser()` csak akkor hívódik meg,
// ha az optionalUser üres
User user2 = optionalUser.orElseGet(() -> new DefaultUser());

Az Optional segít a kód olvashatóságának és biztonságának növelésében, egyértelműen jelezve, hogy az érték hiányozhat. Nem szabad osztálymezőkre vagy metódusparaméterekre használni, ha az érték hiánya kivételes helyzet.