Dúvida no Reduce
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.
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?
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!
É 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.