2
respostas

Optcional<T>

Na minha visão é trocar 6 por meia dúzia verificar se é nulo ou não / utilizar Optional, alguém consegue me convencer ?

2 respostas

Opa Jhonatan, tudo tranquilo?

Realmente, a classe Optional aparenta ser apenas uma outra forma de se escrever alguns ifs checando se o valor é null. O que não está errado, essa realmente é uma das vantagens dele. Mas o foco mesmo está em escrever códigos mais elegantes que se encaixam bem com as outras novidades derivadas do paradigma funcional que chegaram no Java 8. Como é mencionado nessa atividade presente nessa mesma aula, o Optional faz tudo isso através de uma série de métodos que estão à nossa disposição para lidar com diversos casos sem correr o risco de tomarmos um NullPointerException na cara!

Claro, eu poderia citar várias fontes indicando como o Optional poderia ajudar em nossos códigos. Mas como estudante de programação, eu sei que no final das contas só quando botamos a mão na massa e colhemos os resultados - que geralmente vem em forma de código legível e tempo salvo - nós realmente nos convencemos. No capítulo que aborda essa classe no livro Java 8 Prático, tem um exemplo bacaninha que mesmo fora de contexto acredito que ele já dê um gostinho de como ele funciona no contexto das lambdas. Temos então um código com uma cara mais procedural que pega uma lista de usuários e calcula a média de pontos:

double soma = 0;
for (Usuario u : usuarios) {
    soma += u.getPontos();
}

double pontucaoMedia;
if (usuarios.isEmpty()) {
    pontuacaomedia = 0;
}
else {
    pontuacaoMedia = soma / usuarios.size();

Com o Optional, podemos lidar com esses casos de uma maneira mais simples fazendo uso de seus métodos com as lambdas, Streams e method reference. No código abaixo, fazemos a mesma coisa que o código anterior; pegamos a pontuação de cada usuário, calculamos sua média e, caso a lista de usuários esteja vazia, a média será zero e evitamos uma exception.

double pontuacaoMedia = usuarios.stream()
    .mapToInt(Usuario::getPontos)
    .average()
    .orElse(0.0);

obs.: average() retorna um OptionalDouble.

Claro, nada impede que você mesmo não jogue sua própria exceção, caso faça sentido:

double pontuacaoMedia = usuarios.stream()
    .mapToInt(Usuario::getPontos)
    .average()
    .orElseThrow(IllegalStateException::new);

Existem diversos outros métodos que podemos utilizar para que tenhamos total controle sobre cenários como esse. Esse artigo mostra alguns dos principais com exemplos.

Espero ter ajudado. Se ficou alguma dúvida é só avisar!

Bons estudos!!

Opa, Obrigado mano me ajudou muito, na esse orElse é similar a algo que já utilizei em C#, obrigado por compartilhar sua visão.