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

Dúvida no Reduce #6

Open
BrunoSenigalha opened this issue Aug 31, 2023 · 3 comments
Open

Dúvida no Reduce #6

BrunoSenigalha opened this issue Aug 31, 2023 · 3 comments

Comments

@BrunoSenigalha
Copy link

Olá Cami.

Sobre o desafio 12, eu fiz a resolução da seguinte forma:
int produto = numeros.stream().reduce(0, (num1, num2) -> num1 * num2);

Porém, estava dando sempre 0. Então para fins de estudo, joguei no Bard e ele me retornou a seguinte resolução:
int produto = numeros.stream().reduce(1, (num1, num2) -> num1 * num2);

Então acho que não entendi muito para que serve esse número antes da operação, dentro do reduce: antes eu
havia colocado 0, depois tive de colocar 1.
Pelo que você explicou ele é um acumulador certo? Para soma ele funciona normal.
Seria mais ou menos algo como: Acumular utilizando aquele número, já que multiplicação por 0 sempre dará 0.
Se poder me explicar melhor, meio que entendi a lógica mas não entendi como funciona exatamente.

@cami-la
Copy link
Collaborator

cami-la commented Aug 31, 2023

Oi, Bruno. Tudo certinho?

Então, você está entendendo sim! Em partes, mas está. <3 Vamos lá:

  • Quando estamos falando de MULTIPLICAÇÃO, o acumulador precisa começar com 1. Porque?
  • Por que quando o laço começar, vamos pegar o primeiro elemento da lista e multiplicar com o acumulador.
  • Se o acumulador for 0, essa multiplicação sempre será 0 (qualquer número * 0 = 0),
  • Aí precisa necessariamente ser 1. Essa multiplicação sempre resultará neste primeiro número, que é o objetivo. (qualquer número * 1 = qualquer número)
List<Integer> numeros = Arrays.asList(1, 2, 3, 4);

    int acumuladorMultiplicacao = 1;
    //Quando o laço começa, vamos multiplicar o primeiro elemento * acumulador. Logo, 1 * 1 = 1.
    for (Integer n : numeros) {
      acumuladorMultiplicacao *= n; // acumuladorMultiplicacao = acumuladorMultiplicacao * n;
    }
    System.out.println("Resultado da Multiplicação: " + acumuladorMultiplicacao);

    int acumuladorSoma = 0;
    //Quando o laço começa, vamos somar o primeiro elemento + acumulador. Logo, 0 + 1 = 1.
    for (Integer n : numeros) {
      acumuladorSoma += n; // acumuladorSoma = acumuladorSoma + n;
    }
    System.out.println("Resultado da soma: " + acumuladorSoma);
  }

//resultado no console:
Resultado da Multiplicação: 24
Resultado da soma: 10
  • Diferentemente da SOMA, que o acumulador precisa ser 0. Porque?
  • Por que quando o laço começar, vamos pegar o primeiro elemento da lista e somar com o acumulador.
  • Sendo o acumulador 0, essa soma sempre resultará neste primeiro número, que é o objetivo. (qualquer número + 0 = qualquer número).

Com o reduce:

  • Soma:

int soma = numeros.stream().reduce(0, (num1, num2) -> num1 + num2);

  • Multiplicação:

int produto = numeros.stream().reduce(1, (num1, num2) -> num1 * num2);

Deu para dar uma clareada?

@BrunoSenigalha
Copy link
Author

A entendi, então ele sempre vai estar ali fazendo a conta junto com o acumulador. Agooooora entendi pra quê serve o acumulador hahaha.

Muito obrigado Cami, você é uma queridona. Um grande abraço!

@cami-la
Copy link
Collaborator

cami-la commented Aug 31, 2023

É isso mesmoooooo!!!!! Uhuuuu. kkkkk

Eu quem agradeço por assistir os cursos e se empenhar tanto! Faz meu trabalho fazer sentido! <3

Qualquer dúvida, estamos aqui. Abraços.

@cami-la cami-la mentioned this issue Sep 25, 2023
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

2 participants