Метод orElse() позволяет получить значение, хранящееся в объекте класса Optional . Сигнатура метода — orElse(T other). Логика работы метода такова : возвращает значение в объекте, если оно не null, или значение в аргументе метода. Пример кода :
String nullName = null;
String name = Optional.ofNullable(nullName).orElse("john");
assertEquals("john", name);
Метод orElseGet() похож на orElse(). Сигнатура метода — orElseGet(Supplier<? extends T> other). Между orElse() и orElseGet() есть одно важное для понимания отличие. Пример :
public String getMyDefault() {
System.out.println("Getting Default Value");
return "Default Value";
}
@Test
public void whenOrElseGetAndOrElseDiffer_thenCorrect() {
String text = "Text present";
System.out.println("Using orElseGet:");
String defaultText
= Optional.ofNullable(text).orElseGet(this::getMyDefault);
assertEquals("Text present", defaultText);
System.out.println("Using orElse:");
defaultText = Optional.ofNullable(text).orElse(getMyDefault());
assertEquals("Text present", defaultText);
}
Вывод на консоль будет :
Using orElseGet:
Using orElse:
Getting default value
Метод orElseThrow() предоставляет ещё одну возможность обрабатывать отсутствующее значение. Сигнатура метода — orElseThrow(Supplier<? extends X> exceptionSupplier). В этом случае вместо возврата значения по умолчанию будет выброшено исключение. Пример :
@Test(expected = IllegalArgumentException.class)
public void whenOrElseThrowWorks_thenCorrect() {
String nullName = null;
String name = Optional.ofNullable(nullName).orElseThrow(
IllegalArgumentException::new);
}
И последний способ извлечь значение из объекта Optional — метод get(). Сигнатура метода — get(). Пример :
@Test
public void givenOptional_whenGetsValue_thenCorrect() {
Optional<String> opt = Optional.of("baeldung");
String name = opt.get();
assertEquals("baeldung", name);
}
Но, в отличие от трёх разновидностей orElse, get() может возвращать значение, если значение не null. Иначе выбрасывает NoSuchElementException.
@Test(expected = NoSuchElementException.class)
public void givenOptionalWithNull_whenGetThrowsException_thenCorrect() {
Optional<String> opt = Optional.ofNullable(null);
String name = opt.get();
}
Очевидно, что метод get() менее гибок, чем разновидности orElse и, в общем, не совсем подходит цели использования класса Optional.