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 umOptionalcom um valor não nulo. LançaNullPointerExceptionse o valor fornull.ofNullable(T value): Cria umOptionalcom um valor não nulo se existir, ou umOptionalvazio se o valor fornull.empty(): Cria umOptionalvazio.isPresent(): Retornatruese o valor estiver presente, caso contráriofalse.isEmpty(): Retornatruese o valor estiver ausente, caso contráriofalse(adicionado no Java 11).get(): Retorna o valor se estiver presente, caso contrário lançaNoSuchElementException.orElse(T other): Retorna o valor se estiver presente, caso contrário retornaother.orElseGet(Supplier<? extends T> other): Retorna o valor se estiver presente, caso contrário executa e retorna o resultado doSupplier. É preferível aorElse(T other)quando a inicialização deotheré custosa.orElseThrow(Supplier<? extends X> exceptionSupplier): Retorna o valor se estiver presente, caso contrário lança a exceção fornecida porexceptionSupplier.
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.