ganhando_produtividade_com_Stream_API_Java icon indicating copy to clipboard operation
ganhando_produtividade_com_Stream_API_Java copied to clipboard

Duvida Desafio 5

Open Andre-Proenca opened this issue 2 years ago • 3 comments

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. Captura de tela 2023-08-28 203101

Andre-Proenca avatar Aug 29 '23 00:08 Andre-Proenca

@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 avatar Aug 31 '23 19:08 cami-la

@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?

LoostSoull avatar Sep 15 '23 02:09 LoostSoull

Oi, @LoostSoull. Então é o seguinte:

  • .mapToDouble(Integer::doubleValue): Após o filtro, o método mapToDouble é 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étodo doubleValue() em cada elemento. Isso é necessário porque o método average() 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étodo average() retorna um OptionalDouble, que pode conter a média ou estar vazio se o fluxo estiver vazio.
  • O uso do Optional ajuda 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. (:

cami-la avatar Sep 15 '23 13:09 cami-la