Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Duvida Desafio 5 #5

Open
Andre-Proenca opened this issue Aug 29, 2023 · 3 comments
Open

Duvida Desafio 5 #5

Andre-Proenca opened this issue Aug 29, 2023 · 3 comments

Comments

@Andre-Proenca
Copy link

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

@cami-la
Copy link
Collaborator

cami-la commented Aug 31, 2023

@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! (:

@LoostSoull
Copy link

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

@cami-la
Copy link
Collaborator

cami-la commented Sep 15, 2023

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. (:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants