7.8 O Optional em java.util
Por que average() não retorna double diretamente? Se a lista for vazia, dividir por zero resultaria em Infinity. A solução antiga precisava de um if para evitar esse problema. double pontuacaoMedia; if (usuarios.isEmpty()) { pontuacaoMedia = 0; } else { pontuacaoMedia = soma / usuarios.size(); } Solução com OptionalDouble: average() retorna um OptionalDouble, evitando verificações manuais. OptionalDouble media = usuarios.stream() .mapToInt(Usuario::getPontos) .average(); double pontuacaoMedia = media.orElse(0.0); Lançando exceção se a média não existir: double pontuacaoMedia = usuarios.stream() .mapToInt(Usuario::getPontos) .average() .orElseThrow(IllegalStateException::new); Executando ação se houver um valor presente: usuarios.stream() .mapToInt(Usuario::getPontos) .average() .ifPresent(valor -> janela.atualiza(valor)); Uso do Optional Encontrando o usuário com mais pontos: Optional max = usuarios.stream() .max(Comparator.comparingInt(Usuario::getPontos)); Extraindo um valor do Optional: Usuario usuarioComMaisPontos = max.orElse(null); Mapeando para obter o nome do usuário com mais pontos: Optional maxNome = usuarios.stream() .max(Comparator.comparingInt(Usuario::getPontos)) .map(Usuario::getNome); Conclusão O Optional melhora a segurança contra NullPointerException. Evita verificações manuais desnecessárias, tornando o código mais limpo. Trabalha bem com streams, permitindo programação funcional fluente.

Por que average() não retorna double diretamente?
- Se a lista for vazia, dividir por zero resultaria em Infinity.
- A solução antiga precisava de um if para evitar esse problema.
double pontuacaoMedia;
if (usuarios.isEmpty()) {
pontuacaoMedia = 0;
} else {
pontuacaoMedia = soma / usuarios.size();
}
Solução com OptionalDouble:
- average() retorna um OptionalDouble, evitando verificações manuais.
OptionalDouble media = usuarios.stream()
.mapToInt(Usuario::getPontos)
.average();
double pontuacaoMedia = media.orElse(0.0);
Lançando exceção se a média não existir:
double pontuacaoMedia = usuarios.stream()
.mapToInt(Usuario::getPontos)
.average()
.orElseThrow(IllegalStateException::new);
Executando ação se houver um valor presente:
usuarios.stream()
.mapToInt(Usuario::getPontos)
.average()
.ifPresent(valor -> janela.atualiza(valor));
Uso do Optional
Encontrando o usuário com mais pontos:
Optional max = usuarios.stream()
.max(Comparator.comparingInt(Usuario::getPontos));
Extraindo um valor do Optional:
Usuario usuarioComMaisPontos = max.orElse(null);
Mapeando para obter o nome do usuário com mais pontos:
Optional maxNome = usuarios.stream()
.max(Comparator.comparingInt(Usuario::getPontos))
.map(Usuario::getNome);
Conclusão
- O Optional melhora a segurança contra NullPointerException.
- Evita verificações manuais desnecessárias, tornando o código mais limpo.
- Trabalha bem com streams, permitindo programação funcional fluente.