Bem-vindo ao meu blog

Compartilhando conhecimento sobre tecnologia, programação e mais!

Diferença entre os métodos orElse e orElseGet da classe Optional em Java

Publicado em: 30 de July de 2023 | Categorias: Java
Diferença entre os métodos orElse e orElseGet da classe Optional em Java

O Java 8 introduziu a classe Optional como uma maneira de lidar com valores nulos de forma mais segura e expressiva. Ela é uma das grandes melhorias da linguagem para evitar exceções NullPointerException ao trabalhar com valores que podem ou não estar presentes. Entre os métodos disponíveis na classe Optional, dois deles são frequentemente usados para recuperar valores padrão quando o valor dentro do Optional não está presente: orElse e orElseGet. Embora ambos tenham propósitos semelhantes, eles diferem no momento em que o valor padrão é fornecido e no tratamento de computação tardia (lazy evaluation).

O que é a classe Optional?

Antes de mergulharmos nas diferenças entre orElse e orElseGet, é importante entender o que é a classe Optional. O Optional é uma classe que representa um container que pode ou não conter um valor não nulo. Ele foi projetado para encorajar a prática da programação defensiva, forçando o desenvolvedor a explicitamente tratar o cenário em que um valor pode estar ausente.

O método orElse

O método orElse é uma das maneiras mais simples de obter um valor de um Optional. Ele tem a seguinte assinatura:

    
    T orElse(T other)
    

Se o valor dentro do Optional estiver presente, o método retornará esse valor. Caso contrário, ele retornará o valor passado como argumento (other). O argumento other pode ser qualquer valor do tipo apropriado para o Optional, mas é importante notar que, independentemente de o valor dentro do Optional estar presente ou não, o argumento other será avaliado sempre que o método orElse for chamado.

Exemplo de uso do orElse:

    
    Optional<String> optionalValue = Optional.ofNullable(someValue);
    String result = optionalValue.orElse("Valor Padrão");
    

O método orElseGet

O método orElseGet também é usado para obter um valor de um Optional, mas com uma diferença fundamental em relação ao orElse. Sua assinatura é a seguinte:

    
    T orElseGet(Supplier<? extends T> supplier)
    

Em vez de receber diretamente o valor padrão, o orElseGet recebe um Supplier, que é uma interface funcional que representa um fornecedor de valores. A diferença crucial aqui é que o Supplier só será invocado e o valor retornado por ele será criado se o valor dentro do Optional não estiver presente.

Isso é particularmente útil quando a criação do valor padrão envolve uma computação custosa, uma chamada de método ou a obtenção de recursos externos, pois evita a execução desnecessária dessa computação se o valor dentro do Optional já estiver presente.

Exemplo de uso do orElseGet:

    
    Optional<String> optionalValue = Optional.ofNullable(someValue);
    String result = optionalValue.orElseGet(() -> computeDefaultValue());
    

Escolhendo entre orElse e orElseGet

A escolha entre orElse e orElseGet depende das necessidades específicas do cenário em que estão sendo usados. Em geral:

Conclusão

Os métodos orElse e orElseGet da classe Optional em Java fornecem maneiras seguras e flexíveis de recuperar valores padrão quando o valor dentro do Optional não está presente. A diferença entre eles reside na forma como o valor padrão é fornecido: orElse usa um valor diretamente, enquanto orElseGet utiliza um Supplier, permitindo a computação tardia do valor apenas quando necessário. Escolher o método adequado depende da natureza do valor padrão e das necessidades de desempenho da aplicação.

A utilização apropriada desses métodos pode melhorar a legibilidade do código e reduzir a incidência de NullPointerException, tornando o código mais robusto e seguro. É sempre recomendável usar Optional sempre que possível, especialmente quando se trabalha com APIs que podem retornar valores nulos.