Sobes.tech
Middle

O que você sabe sobre a classe Optional?

sobes.tech IA

Resposta da IA

Optional<T> é uma classe contêiner que pode conter um valor não nulo do tipo T ou estar vazio. Foi adicionada no Java 8 para resolver o problema de ponteiros nulos.

Métodos principais:

  • of(T value): Cria um Optional com um valor não nulo. Lança NullPointerException se o valor for null.
  • ofNullable(T value): Cria um Optional com um valor não nulo se existir, ou um Optional vazio se o valor for null.
  • empty(): Cria um Optional vazio.
  • isPresent(): Retorna true se o valor estiver presente, caso contrário false.
  • isEmpty(): Retorna true se o valor estiver ausente, caso contrário false (adicionado no Java 11).
  • get(): Retorna o valor se estiver presente, caso contrário lança NoSuchElementException.
  • orElse(T other): Retorna o valor se estiver presente, caso contrário retorna other.
  • orElseGet(Supplier<? extends T> other): Retorna o valor se estiver presente, caso contrário executa e retorna o resultado do Supplier. É preferível a orElse(T other) quando a inicialização de other é custosa.
  • orElseThrow(Supplier<? extends X> exceptionSupplier): Retorna o valor se estiver presente, caso contrário lança a exceção fornecida por exceptionSupplier.

Exemplo de uso para evitar NullPointerException:

// Em vez de
User user = findUserById(userId);
if (user != null) {
    String email = user.getEmail();
    // ...
}

// Pode usar Optional
Optional<User> userOptional = findUserByIdOptional(userId);
userOptional.ifPresent(user -> {
    String email = user.getEmail();
    // ...
});

Comparação entre orElse e orElseGet:

// Ambas as chamadas retornarão DefaultUser se optionalUser estiver vazio
// Mas no caso de orElse, new DefaultUser() será sempre chamado,
// mesmo que optionalUser contenha um valor
User user1 = optionalUser.orElse(new DefaultUser());

// No caso de orElseGet, new DefaultUser() será chamado apenas
// se optionalUser estiver vazio
User user2 = optionalUser.orElseGet(() -> new DefaultUser());

Optional ajuda a tornar o código mais legível e seguro, indicando explicitamente que o valor pode estar ausente. Não deve ser usado para campos de classe ou parâmetros de métodos se a ausência do valor for uma situação excepcional.