Dominando o Java 8 Optional: Guia Prático para Código Null‑Safe
O Optional é um objeto contêiner usado para armazenar objetos não nulos. Ele representa a ausência de valor em vez de null, fornecendo métodos utilitários para lidar com valores como "presente" ou "ausente", evitando verificações explícitas de null. Introduzido no Java 8, é semelhante ao Optional do Guava.
Declaração da Classe
Segue a declaração da classe java.util.Optional<T>:
public final class Optional<T> extends Object
Métodos da Classe
| Nº | Método e Descrição |
|---|---|
| 1 | static <T> Optional<T> empty() Retorna uma instância vazia de Optional. |
| 2 | boolean equals(Object obj) Indica se outro objeto é "igual a" este Optional. |
| 3 | Optional<T> filter(Predicate<? super T> predicate) Se um valor estiver presente e corresponder ao predicado, retorna um Optional descrevendo o valor; caso contrário, retorna um Optional vazio. |
| 4 | <U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) Se um valor estiver presente, aplica a função de mapeamento que retorna Optional e devolve o resultado; caso contrário, retorna um Optional vazio. |
| 5 | T get() Retorna o valor se presente; caso contrário, lança |
| 6 | int hashCode() Retorna o código hash do valor presente ou 0 se nenhum valor estiver presente. |
| 7 | void ifPresent(Consumer<? super T> consumer) Se um valor estiver presente, invoca o consumidor especificado com o valor; caso contrário, não faz nada. |
| 8 | boolean isPresent() Retorna |
| 9 | <U> Optional<U> map(Function<? super T, ? extends U> mapper) Se um valor estiver presente, aplica a função de mapeamento e, se o resultado não for nulo, retorna um Optional descrevendo o resultado. |
| 10 | static <T> Optional<T> of(T value) Retorna um Optional com o valor não nulo especificado. |
| 11 | static <T> Optional<T> ofNullable(T value) Retorna um Optional descrevendo o valor especificado se não nulo; caso contrário, retorna um Optional vazio. |
| 12 | T orElse(T other) Retorna o valor se presente; caso contrário, retorna |
| 13 | T orElseGet(Supplier<? extends T> other) Retorna o valor se presente; caso contrário, invoca |
| 14 | <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) Retorna o valor contido se presente; caso contrário, lança uma exceção criada pelo supplier fornecido. |
| 15 | String toString() Retorna uma representação em string não vazia deste Optional, adequada para depuração. |
Esta classe herda métodos de:
- java.lang.Object
Exemplo de Uso do Optional
Crie o seguinte programa Java em, por exemplo, C:\JAVA.
Java8Tester.java
import java.util.Optional;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8Tester = new Java8Tester();
Integer value1 = null;
Integer value2 = new Integer(10);
// Optional.ofNullable permite parâmetro null
Optional<Integer> a = Optional.ofNullable(value1);
// Optional.of lança NullPointerException se o parâmetro for null
Optional<Integer> b = Optional.of(value2);
System.out.println(java8Tester.sum(a, b));
}
public Integer sum(Optional<Integer> a, Optional<Integer> b) {
// Verifica se o valor está presente
System.out.println("Primeiro parâmetro presente: " + a.isPresent());
System.out.println("Segundo parâmetro presente: " + b.isPresent());
// Retorna o valor ou um padrão se ausente
Integer value1 = a.orElse(new Integer(0));
// Obtém o valor (deve estar presente)
Integer value2 = b.get();
return value1 + value2;
}
}
Verificando o Resultado
Compile com javac:
C:\JAVA>javac Java8Tester.java
Execute:
C:\JAVA>java Java8Tester
Saída esperada:
Primeiro parâmetro presente: false Segundo parâmetro presente: true 10
Java
- Entendendo a Palavra-chave final em Java: Variáveis, Métodos e Classes
- Operador instanceof em Java: Guia Completo
- Entendendo Classes Aninhadas Estáticas em Java: Uso, Diferenças e Exemplos
- Dominando Classes Internas Anônimas em Java: Definição, Sintaxe e Exemplos Práticos
- Padrão Singleton em Java Explicado: Como Implementar e Usar com Segurança
- Dominando Reflection em Java: Inspecionando Classes, Métodos e Campos em Tempo de Execução
- Dominando Java ObjectOutputStream: Serialização, Métodos e Exemplos Práticos
- Dominando Java Generics – Construindo Código Reutilizável e Type-Safe
- Dominando Operações de Arquivo em Java com java.io – Criação, Leitura, Escrita e Exclusão
- Java 9: Novos Recursos para a Classe Optional