Skip to content

Commit 1e70ffa

Browse files
committed
feature(using-streams): exemplos de reduce
Adicionando exemplos de reduce. Ref. Issue #23
1 parent 9839ac8 commit 1e70ffa

File tree

4 files changed

+104
-2
lines changed

4 files changed

+104
-2
lines changed

book/05-java-streams/sections/01-using-streams.asc

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -533,14 +533,70 @@ Soma: 45
533533
Média: 4.5
534534
----
535535

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.
543+
+
544+
[source,java,indent=0]
545+
.{java-package}/usingstreams/primitives/Streams_Reduce.java
546+
----
547+
include::{section-java-package}/usingstreams/primitives/Streams_Reduce.java[tag=code]
548+
----
549+
+
550+
.Saída no console
551+
[source,console]
552+
----
553+
336
554+
----
555+
+
556+
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.
559+
+
560+
[source,java,indent=0]
561+
.{java-package}/usingstreams/primitives/Streams_ReduceIdentity.java
562+
----
563+
include::{section-java-package}/usingstreams/primitives/Streams_ReduceIdentity.java[tag=code]
564+
----
565+
+
566+
.Saída no console
567+
[source,console]
568+
----
569+
336
570+
----
571+
+
572+
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.
577+
+
578+
[source,java,indent=0]
579+
.{java-package}/usingstreams/primitives/Streams_ReduceCombiner.java
580+
----
581+
include::{section-java-package}/usingstreams/primitives/Streams_ReduceCombiner.java[tag=code]
582+
----
583+
+
584+
.Saída no console
585+
[source,console]
586+
----
587+
336
588+
----
589+
+
590+
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.
591+
592+
===== Collect
537593

538594
. collect
539595
. joining
540596
. averaging int
541597
. toCollection
542598
. toMap
543-
. toMap com construtor do mapa (3 param)
599+
. toMap (3 param)
544600
. groupingBy
545601
. groupingBy (2 param)
546602
. groupingBy (3 param)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.j6toj8.streams.usingstreams.reduce;
2+
3+
import java.util.Optional;
4+
import java.util.stream.Stream;
5+
6+
public class Streams_Reduce {
7+
8+
public static void main(String[] args) {
9+
// tag::code[]
10+
Optional<Integer> reduce = Stream.of(7, 2, 3, 8)
11+
.reduce((e1, e2) -> e1 * e2); // reduce que multiplica todos os números
12+
13+
System.out.println(reduce.get());
14+
// end::code[]
15+
}
16+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.j6toj8.streams.usingstreams.reduce;
2+
3+
import java.util.stream.Stream;
4+
5+
public class Streams_ReduceCombiner {
6+
7+
public static void main(String[] args) {
8+
// tag::code[]
9+
Integer reduce = Stream.of(7, 2, 3, 8)
10+
.reduce(1, (e1, e2) -> e1 * e2, (e1, e2) -> e1 * e2);
11+
12+
System.out.println(reduce);
13+
// end::code[]
14+
}
15+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.j6toj8.streams.usingstreams.reduce;
2+
3+
import java.util.stream.Stream;
4+
5+
public class Streams_ReduceIdentity {
6+
7+
public static void main(String[] args) {
8+
// tag::code[]
9+
Integer reduce = Stream.of(7, 2, 3, 8)
10+
.reduce(1, (e1, e2) -> e1 * e2);
11+
12+
System.out.println(reduce);
13+
// end::code[]
14+
}
15+
}

0 commit comments

Comments
 (0)