You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: book/05-java-streams/sections/01-using-streams.asc
+58-2Lines changed: 58 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -533,14 +533,70 @@ Soma: 45
533
533
Média: 4.5
534
534
----
535
535
536
-
==== Collectors
536
+
==== _Reduce_ e _Collectors_
537
+
538
+
===== Reduce
539
+
540
+
_Reduce_ é uma das principais operações final que podem ser feitas em um _Stream_. _Reduce_ é uma operação que transforma os vários valores do _Stream_ em um único valor. Várias operações apresentadas anteriormente são um tipo de _Reduce_, como: `max`, `min` e `summaryStatistics`. Porém, nem sempre essas operações são suficientes, e por isso existem os métodos `reduce`. Eles permitem a implementação de operações personalizadas de _Reduce_.
541
+
542
+
. É possível criar uma operação de Reduce personalizada com o método `reduce()` que recebe 1 argumento.
Nesse caso está sendo feito um _Reduce_ onde o resultado da operação anterior é passado para a próxima execução. Ou seja, primeiro é feita a multiplicação de 7 * 2, que é 14. Então a função é chamada novamente passando como argumento o resultado anterior (14) e o próximo número do Stream (3). O resultado é 42. Então a função é chamada uma última vez passando o resultado anterior (42) e o próximo número do Stream (8), o que dá o resultado de 336.
557
+
558
+
. É possível criar uma operação de _Reduce_ informando o valor de identidade.
Nesse caso é possível informar o valor de identidade da função. O conceito de valor ou função de identidade são um pouco mais complexos, mas para a certificação apenas compreenda que ele representa um valor neutro. Ou seja, para a operação de multiplicação, o valor de identidade é 1, pois qualquer valor multiplicado por 1 resulta nele mesmo. Caso fosse uma operação de soma, o valor de identidade seria 0, pois qualquer valor somado a 0 resulta nele mesmo.
573
+
+
574
+
Além disso, se o _Stream_ estiver vazio, o valor de identidade será retornado. Por isso, diferente do exemplo anterior, não é necessário retornar um `Optional`.
575
+
576
+
. É possível criar uma operação de _Reduce_ que pode ser executada em várias _Threads_ e depois combinada em um único valor.
Nesse caso é passado um argumento adicional. Ele é a função de combinação. Essa função é utilizada quando o _Stream_ é paralelo, ou seja, utiliza mais de uma _thread_. Ela pega o valor retornado por 2 ou mais _threads_ e combina-os em um único valor. Em uma operação de multiplicação, a combinação também é uma multiplicação. Ou seja, caso a primeira _thread_ multiplique 7 e 2, resultando em 14, e a segunda multiplique 3 e 8, resultando em 24, a função de combinação só precisa multiplicar 14 por 24 para chegar ao valor de 336. Sendo assim, a função de combinação só faz sentido em um _Stream_ paralelo, que será apresentado no próximo capítulo.
0 commit comments