Бросить исключение в опционально в Java 8

Бросать исключение в опционально в Java 8

1. Вступление

В этом уроке мы собираемся показать, как генерировать пользовательское исключение, когдаOptional is пусто.

Если вы хотите глубже изучить долюOptional, , взгляните на наш полныйguide здесь.

2. Optional.orElseThrowс

Проще говоря, если значение присутствует, тоisPresent() вернетtrue, а вызовget() will вернет это значение. В противном случае он выбрасываетNoSuchElementException.

Также существует методorElseThrow(Supplier<? extends X> exceptionSupplier), который позволяет нам предоставить собственный экземпляр Exception. Этот метод вернет значение, только если оно есть. В противном случае будет выдано исключение, созданное предоставленным поставщиком.

3. В бою

Представьте себе, чтоwe have a method which returns a nullable result:

public String findNameById(String id) {
    return id == null ? null : "example-name";
}

Теперь мы собираемся дважды вызвать наш методfindNameById(String id) и заключить результат вOptional с помощью методаofNullable(T value).

Optional provides a static factory method for creating new instancesЭтот метод называетсяofNullable(T value). Тогда мы можем вызватьorElseThrow.

Мы можем проверить поведение, выполнив этот тест:

@Test
public void whenIdIsNull_thenExceptionIsThrown() {
    assertThrows(InvalidArgumentException.class, () -> Optional
      .ofNullable(personRepository.findNameById(null))
      .orElseThrow(InvalidArgumentException::new));
}

Согласно нашей реализацииfindNameById will returnnull. Таким образом, новыйInvalidArgumentException будет выведен из метода orElseThrow .

Мы можем вызвать этот метод с ненулевым аргументом. Тогда мы не получимInvalidArgumentException:

@Test
public void whenIdIsNonNull_thenNoExceptionIsThrown() {
    assertAll(() -> Optional
      .ofNullable(personRepository.findNameById("id"))
      .orElseThrow(RuntimeException::new));
}

4. Вывод __

В этой быстрой статье мы обсудили, как вызвать исключение из Java 8Optional. 

Как всегда ставим исходный кодon our GitHub.