Duvida Desafio 5
List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3);
OptionalDouble media = numeros.stream().filter(n -> n > 5).mapToDouble(Integer::doubleValue).average();
System.out.printf("A média para os maiores de 5 é : " + media);
Eu cheguei a essa conclusão, porém na impressão sai, OptionalDouble[8.0]
eu gostaria que imprimisse no console somente o resultado da média, 8.0 sem o OptionalDouble.
@Andre-Proenca André, muito bom, hein! Entendendo direitinho como usar o Stream API. Parabéns.
Para resolver bem rapidinho essa saída, tem várias formas de fazer isso. Uma forma bem simples (mas que eu não recomendo) é simplesmente camar o método getAsDouble(). Assim:
System.out.printf("A média para os maiores de 5 é : " + media.getAsDouble());
Pode fazer assim também:
List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3);
double media = numeros.stream()
.filter(n -> n > 5)
.mapToDouble(Integer::doubleValue)
.average()
.orElseThrow(() -> new NoSuchElementException("Não foi possível encontrar a média."));
System.out.printf("A média para os maiores de 5 é : " + media);
Por que disso? O método average() retorna um Optional, aí precisamos "tratar" esse resultado.
Tem vários métodos para fazer esse "tratamento". No exemplo acima, resolvi tratar lançando uma NoSuchElementException caso o resultado não encontrado por algum motivo...
Se ainda ficou dúvida, é só falar. Bons estudos! Está indo muito bem! (:
@cami-la , me perdi no optional , optionaltodouble, ele cria um novo objeto no formato double e o maptodouble que converse meus valores para double? o avarege somente realizou o calculo da media?
Oi, @LoostSoull. Então é o seguinte:
.mapToDouble(Integer::doubleValue): Após o filtro, o métodomapToDoubleé usado para converter os elementos filtrados (números inteiros maiores do que 5) em números de ponto flutuante (double). Ele faz isso chamando o métododoubleValue()em cada elemento. Isso é necessário porque o métodoaverage()que será usado posteriormente requer um fluxo de elementos do tipo double. Podemos fazer assim também:.mapToDouble(n -> n.doubleValue()).average(): Este método é usado para calcular a média dos números no fluxo. Nesse ponto, temos apenas os números maiores do que 5 em formato de double no fluxo. O métodoaverage()retorna umOptionalDouble, que pode conter a média ou estar vazio se o fluxo estiver vazio.- O uso do
Optionalajuda a lidar de forma mais segura com situações em que um resultado pode ser indefinido ou ausente, em vez de retornar um valor nulo (null). Neste caso, para lidar com a possibilidade de que o resultado do cálculo da média seja indefinido, ou seja, quando não há números na lista que atendam ao critério (números maiores do que 5).
Ficou mais claro agora? Se ainda ficou alguma dúvida, pode falar. (: