ganhando_produtividade_com_Stream_API_Java icon indicating copy to clipboard operation
ganhando_produtividade_com_Stream_API_Java copied to clipboard

Dúvida no Reduce

Open BrunoSenigalha opened this issue 2 years ago • 3 comments

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.

BrunoSenigalha avatar Aug 31 '23 14:08 BrunoSenigalha

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?

cami-la avatar Aug 31 '23 19:08 cami-la

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!

BrunoSenigalha avatar Aug 31 '23 19:08 BrunoSenigalha

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