"A classe java.util.Optional
é a forma de tratar retornos de métodos que podem ou não retornar um valor, nesse caso para evitar o retorno de null
e evitar erros de NullPointerException
.
Com Optional
temos a possibilidade de testar se um valor está "presente" antes de consumi-lo, dando abertura ao método que retorna o valor a possibilidade de em vez de lançar uma exception, retornar um Optional nos casos onde o valor pode ser nulo ou não.
Em casos onde obrigatoriamente um valor direferente de nulo deve ser retornado, então a abordagem de lançar exception continua a mesma, porém pode-se aproveitar do lançamento de NoSuchElementException
através Optional.of()
."
- Optional = Classe container para objetos.
- Tipo parametrizado que uma instância de Optional deve comportar.
Retorna true caso o objeto contido no optional não seja nulo e false caso seja.
Retorna o valor contido no optional porém lança uma exception caso o valor seja nulo. Obs.: A exception a ser lançada é fornercida por meio de um Supplier.
Retorna o valor contido no optional ou retorna um outro valor obtido a partir de um Supplier e retorna o novo valor.
Executa uma ação a partir de um consumer caso o valor esteja presente.
Executa uma ação a partir de um consumer caso o valor esteja presente ou uma outra ação sem receber parâmetros e sem retorno caso contrário.
Aplica uma condição para retornar o valor/valores contidos no encadeamento do chamadas no optional.
Faz uma transformação a partir de um valor e retorna um optional contendo o valor transformado.
Faz uma transformação a partir de um valor retornando o valor "achatado" (sem estar embutido em um optional), em resumo retorna o dito valor transformado e não um optional contendo o valor transformado.
Existem classes de optional projetadas para tipos primitivos e são úteis quando querermos aproveitar os recursos de optional mas não queremos utilizar classes wrapper e correr o risco do boxing/unboxing degradar performance em grandes processamentos de dados.
Optional para tipo primitivo
int
.
Optional para tipo primitivo
long
.
Optional para tipo primitivo
double
.
- coleções (adicionar diretamente o valor e não um optional dele, para não alocar mais objetos desnecessariamente)
- Se método não retorna Optional
, basta testar null
mesmo, em vez de criar um optional apenas para chamar isPresent()
.
Optional são muito úteis, porém deve se atender que há um custo de utilizar e deve se contextualizar quando aplicar o seu uso.