Lançar exceção no opcional em Java 8

Lançar exceção no opcional em Java 8

1. Introdução

Neste tutorial, vamos mostrar como lançar uma exceção personalizada quando umOptional is vazio.

Se você quiser se aprofundar na participação deOptional, , dê uma olhada em nossoguide completo, aqui.

2. Optional.orElseThrow

Simplificando, se o valor estiver presente,isPresent() retornarátrue, e chamarget() retornará esse valor. Caso contrário, ele lançaNoSuchElementException.

Também existe um métodoorElseThrow(Supplier<? extends X> exceptionSupplier) que nos permite fornecer uma instância de Exception personalizada. Este método retornará valor apenas se ele estiver presente. Caso contrário, ele lançará uma exceção criada por um fornecedor fornecido.

3. Em ação

Imagine quewe have a method which returns a nullable result:

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

Agora vamos chamar nosso métodofindNameById(String id) duas vezes e envolver o resultado com umOptional usando o métodoofNullable(T value).

Optional provides a static factory method for creating new instancesEste método é denominadoofNullable(T value). Então podemos chamarorElseThrow.

Podemos verificar o comportamento executando este teste:

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

De acordo com nossa implementação,findNameById retorno de lavagemnull. Portanto, a nova lavagemInvalidArgumentException erá lançada a partir do método orElseThrow .

Podemos chamar esse método com um argumento não nulo. Então, não teremos umInvalidArgumentException:

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

4. Conclusão __

Neste artigo rápido, discutimos como lançar uma exceção do Java 8Optional. 

Como sempre, colocamos o código-fonteon our GitHub.