Skip to content

Commit c638d08

Browse files
committed
feat(using-streams): operações finais
Adicionando os exemplos de Operações Finais em Streams. Ref. Issue #23
1 parent 4f58d91 commit c638d08

File tree

5 files changed

+155
-4
lines changed

5 files changed

+155
-4
lines changed

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

Lines changed: 75 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,10 +263,81 @@ Perceba que nesse caso existem 3 `Arrays` distintos. Então cria-se um _Stream_
263263

264264
===== Operações finais
265265

266-
. forEach que já estava sendo utilizado
267-
. max, min, count
268-
. findAny, findFirst
269-
. allMatch, anyMatch, noneMatch
266+
. É possível executar uma ação final para cada elemento do _Stream_ utilizando a operação ``forEach``, conforme demonstrado nos exemplos anteriores.
267+
268+
. É possível recuperar o maior e o menor valor de um _Stream_ utilizando as operações finais `max` e ``min``.
269+
. É possível recuperar a quantidade de elementos de um _Stream_ utilizando a operação final ``count``.
270+
+
271+
[source,java,indent=0]
272+
.{java-package}/usingstreams/Streams_MaxMinCount.java
273+
----
274+
include::{section-java-package}/usingstreams/Streams_MaxMinCount.java[tag=code]
275+
----
276+
+
277+
.Saída no console
278+
[source,console]
279+
----
280+
Max: 9
281+
Min: 1
282+
Count: 8
283+
----
284+
+
285+
No caso das operações `max` e `min`, é necessário passar como argumento qual comparador será utilizado. Como os números possuem uma ordem natural, isto é, implementam a interface ``Comparable``, é possível utilizar um comparador que usa essa ordem natural, que é o ``Comparator.naturalOrder()``. Caso seja um tipo de objeto que não possui uma ordem natural, é necessário passar como argumento uma outra implementação de ``Comparator``.
286+
287+
. É possível pegar o primeiro elemento do Stream utilizando a operação final ``findFirst``, ou um elemento qualquer com ``findAny``.
288+
+
289+
[source,java,indent=0]
290+
.{java-package}/usingstreams/Streams_FindFirstAny.java
291+
----
292+
include::{section-java-package}/usingstreams/Streams_FindFirstAny.java[tag=code]
293+
----
294+
+
295+
.Saída no console
296+
[source,console]
297+
----
298+
First: 7
299+
Any: 7
300+
----
301+
+
302+
Nesse caso, como o _Stream_ é sequencial e não paralelo, os dois resultados são iguais. Em _Streams_ paralelos, que serão apresentados em uma próxima seção, a operação `findAny` pode trazer resultados diferentes.
303+
304+
. É possível verificar se os elementos do _Stream_ atendem a alguma validação utilizando as operações finais ``allMatch``, ``anyMatch`` e `noneMatch`.
305+
+
306+
[source,java,indent=0]
307+
.{java-package}/usingstreams/Streams_Match.java
308+
----
309+
include::{section-java-package}/usingstreams/Streams_Match.java[tag=code]
310+
----
311+
+
312+
.Saída no console
313+
[source,console]
314+
----
315+
anyMatch: true
316+
allMatch: false
317+
noneMatch: false
318+
----
319+
+
320+
Perceba que na primeira operação é verificado se *qualquer* elemento é maior do que 5. Na segunda, se *todos* os elementos são maiores do que 5. E na terceira, se *nenhum* elemento é maior do que 5.
321+
322+
. Não é possível chamar mais de uma operação final no mesmo __Stream__.
323+
+
324+
[source,java,indent=0]
325+
.{java-package}/usingstreams/Streams_ReuseStream.java
326+
----
327+
include::{section-java-package}/usingstreams/Streams_ReuseStream.java[tag=code]
328+
----
329+
+
330+
.Saída no console
331+
[source,console]
332+
----
333+
7
334+
2
335+
1
336+
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
337+
at java.util.stream.AbstractPipeline.sourceStageSpliterator(AbstractPipeline.java:279)
338+
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
339+
at org.j6toj8.streams.usingstreams.Streams_ReuseStream.main(Streams_ReuseStream.java:11)
340+
----
270341

271342
===== Pipeline
272343

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.j6toj8.streams.usingstreams;
2+
3+
import java.util.Optional;
4+
import java.util.stream.Stream;
5+
6+
public class Streams_FindFirstAny {
7+
8+
public static void main(String[] args) {
9+
// tag::code[]
10+
Optional<Integer> findFirst = Stream.of(7, 2, 1, 8, 4, 9, 2, 8) // stream de vários Integer
11+
.findFirst(); // pega o primeiro número do Stream
12+
System.out.println("First: " + findFirst.get());
13+
14+
Optional<Integer> findAny = Stream.of(7, 2, 1, 8, 4, 9, 2, 8) // stream de vários Integer
15+
.findAny(); // pega qualquer número do Stream
16+
System.out.println("Any: " + findAny.get());
17+
// end::code[]
18+
}
19+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.j6toj8.streams.usingstreams;
2+
3+
import java.util.stream.Stream;
4+
5+
public class Streams_Match {
6+
7+
public static void main(String[] args) {
8+
// tag::code[]
9+
boolean anyMatch = Stream.of(7, 2, 1, 8, 4, 9, 2, 8) // stream de vários Integer
10+
.anyMatch(e -> e > 5); // vefifica se algum elemento é maior que 5
11+
System.out.println("anyMatch: " + anyMatch);
12+
13+
boolean allMatch = Stream.of(7, 2, 1, 8, 4, 9, 2, 8) // stream de vários Integer
14+
.allMatch(e -> e > 5); // vefifica se TODOS os elementos são maior que 5
15+
System.out.println("allMatch: " + allMatch);
16+
17+
boolean noneMatch = Stream.of(7, 2, 1, 8, 4, 9, 2, 8) // stream de vários Integer
18+
.noneMatch(e -> e > 5); // vefifica NENHUM elemento é maior que 5
19+
System.out.println("noneMatch: " + noneMatch);
20+
21+
// end::code[]
22+
}
23+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.j6toj8.streams.usingstreams;
2+
3+
import java.util.Comparator;
4+
import java.util.Optional;
5+
import java.util.stream.Stream;
6+
7+
public class Streams_MaxMinCount {
8+
9+
public static void main(String[] args) {
10+
// tag::code[]
11+
Optional<Integer> max = Stream.of(7, 2, 1, 8, 4, 9, 2, 8) // stream de vários Integer
12+
.max(Comparator.naturalOrder()); // pega o maior número do Stream
13+
System.out.println("Max: " + max.get());
14+
15+
Optional<Integer> min = Stream.of(7, 2, 1, 8, 4, 9, 2, 8) // stream de vários Integer
16+
.min(Comparator.naturalOrder()); // pega o menor número do Stream
17+
System.out.println("Min: " + min.get());
18+
19+
long count = Stream.of(7, 2, 1, 8, 4, 9, 2, 8) // stream de vários Integer
20+
.count(); // pega a quantidade de elementos do Stream
21+
System.out.println("Count: " + count);
22+
// end::code[]
23+
}
24+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.j6toj8.streams.usingstreams;
2+
3+
import java.util.stream.Stream;
4+
5+
public class Streams_ReuseStream {
6+
7+
public static void main(String[] args) {
8+
// tag::code[]
9+
Stream<Integer> stream = Stream.of(7, 2, 1);
10+
stream.forEach(System.out::println); // imprime elementos do Stream
11+
stream.forEach(System.out::println); // LANÇA EXCEÇÃO - o Stream já estava fechado
12+
// end::code[]
13+
}
14+
}

0 commit comments

Comments
 (0)