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): SukuriaOptionalsu ne tuščia reikšme. MetaNullPointerException, jei reikšmėnull.ofNullable(T value): SukuriaOptionalsu ne tuščia reikšme, jei ji yra, arba tuščiąOptional, jei reikšmėnull.empty(): Sukuria tuščiąOptional.isPresent(): Grąžinatrue, jei reikšmė yra, kitaipfalse.isEmpty(): Grąžinatrue, jei reikšmė nėra, kitaipfalse(pridėta Java 11).get(): Grąžina reikšmę, jei ji yra, kitaip metaNoSuchElementException.orElse(T other): Grąžina reikšmę, jei ji yra, kitaipother.orElseGet(Supplier<? extends T> other): Grąžina reikšmę, jei ji yra, kitaip vykdoSupplierir grąžina jo rezultatą. Pirmenybė teikiamaorElse(T other)esant brangiai inicializacijai.orElseThrow(Supplier<? extends X> exceptionSupplier): Grąžina reikšmę, jei ji yra, kitaip meta išimtį, kurią pateikiaexceptionSupplier.
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.