Middle
Šta znate o klasi Optional?
sobes.tech АИ
Одговор од АИ
Optional<T> је класа контејнера која може садржати или неуказану вредност типа T или бити празна. Додата је у Java 8 како би се решио проблем null показивача.
Главне методе:
of(T value): КреираOptionalса неуказаном вредношћу. БацаNullPointerExceptionако је вредностnull.ofNullable(T value): КреираOptionalса неуказаном вредношћу ако постоји, или празанOptionalако је вредностnull.empty(): Креира празанOptional.isPresent(): Враћаtrueако је вредност присутна, иначеfalse.isEmpty(): Враћаtrueако вредност недостаје, иначеfalse(додато у Java 11).get(): Враћа вредност ако је присутна, иначе бацаNoSuchElementException.orElse(T other): Враћа вредност ако је присутна, иначеother.orElseGet(Supplier<? extends T> other): Враћа вредност ако је присутна, иначе извршава и враћа резултатSupplier. Преферира се у односу наorElse(T other)када је иницијализацијаotherскупа.orElseThrow(Supplier<? extends X> exceptionSupplier): Враћа вредност ако је присутна, иначе баца изузетак који пружаexceptionSupplier.
Пример коришћења за избегавање NullPointerException:
// Уместо
User user = findUserById(userId);
if (user != null) {
String email = user.getEmail();
// ...
}
// Може се користити Optional
Optional<User> userOptional = findUserByIdOptional(userId);
userOptional.ifPresent(user -> {
String email = user.getEmail();
// ...
});
Поређење orElse и orElseGet:
// Обе позива ће вратити DefaultUser ако је optionalUser празан
// Али у случају `orElse`, `new DefaultUser()` ће увек бити позван,
// чак и ако optionalUser садржи вредност
User user1 = optionalUser.orElse(new DefaultUser());
// У случају `orElseGet`, `new DefaultUser()` ће бити позван само
// ако је optionalUser празан
User user2 = optionalUser.orElseGet(() -> new DefaultUser());
Optional помаже да код буде читљивији и безбеднији, јасно указујући да вредност може недостајати. Не треба га користити за поља класа или параметре метода ако је одсуство вредности изузетна ситуација.