Класс Optional в Java

Метод 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
 
То есть при использовании orElseGet() метод getMyDefault() не будет вызван в случае, когда text != null. А метод orElse() будет вызван в любом случае. Это отличие может быть существенным, если orElse будет «вызывать» ёмкие операции вроде создания web-сервиса или создания соединения с базой данных.

Метод 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. 

Назад

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *