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 egyOptional-t nem null értékkel.NullPointerException-t dob, ha az értéknull.ofNullable(T value): Létrehoz egyOptional-t nem null értékkel, ha van, vagy üresOptional-t, ha az értéknull.empty(): ÜresOptional-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önbenNoSuchElementException-t dob.orElse(T other): Visszaadja az értéket, ha jelen van, különbenother-t.orElseGet(Supplier<? extends T> other): Visszaadja az értéket, ha jelen van, különben végrehajtja és visszaadja aSuppliereredményét. Előnyösebb, mint azorElse(T other), ha azotherinicializálása költséges.orElseThrow(Supplier<? extends X> exceptionSupplier): Visszaadja az értéket, ha jelen van, különben kivételt dob, amit azexceptionSupplierszolgá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.