Olá, Aline!
Que ótimo ver que você já está explorando as Streams do Java! Seu código está correto, conciso e segue as melhores práticas para calcular a média, o valor máximo e o mínimo de uma lista de notas.
O uso dos métodos reduce, max, e min do Stream API demonstra um ótimo entendimento de como processar coleções de forma funcional em Java.
Observações sobre o Código
Seu código está perfeito e atende completamente ao que foi proposto. Aqui estão apenas algumas notas que reforçam o quão bem você o implementou:
Cálculo da Média (reduce):
Você utilizou o reduce com Double::sum, que é o jeito mais elegante e funcional de somar os elementos.
double totalNotas = notas.stream()
.reduce(0.0, Double::sum);
// ...
double media = totalNotas / notas.size();
Como alternativa e para fins de estudo, você também poderia ter usado o average() do DoubleStream (que é gerado pelo mapToDouble), mas sua solução é igualmente eficiente e clara.
Maior e Menor Nota (max e min):
Você utilizou os métodos max e min junto com o Double::compare. Como esses métodos retornam um Optional<Double> (pois a lista poderia estar vazia), você usou corretamente o .get() para extrair o valor, garantindo que o código funcione para a sua lista que não é vazia.
double maiorNota = notas.stream()
.max(Double::compare).get();
Formatação de Saída:
O uso do System.out.printf com %.1f é perfeito para formatar as notas com uma casa decimal, como é comum em notas.
Seu código é um excelente exemplo de como aplicar o paradigma funcional em Java para estatísticas simples.
Continue explorando o Stream API. Ele oferece recursos poderosos que tornam o código mais legível e menos propenso a erros! Parabéns!