Skip to content

Commit 9839ac8

Browse files
committed
feature(using-streams): streams de tipos primitivos
Adicionando exemplos sobre Streams de tipos primitivos: IntStream, DoubleStream e LongStream. Ref. Issue #23
1 parent 6c7d08e commit 9839ac8

File tree

6 files changed

+208
-5
lines changed

6 files changed

+208
-5
lines changed

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

Lines changed: 100 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -432,11 +432,106 @@ Perceba que, mesmo que a operação `peek` esteja antes da operação `limit`, e
432432

433433
==== Streams primitivos
434434

435-
. primitivos: DoubleStream, IntStream, LongStream
436-
. map para primitivos
437-
. generate para streams primitivos
438-
. range closed
439-
. statistics
435+
Existem Streams específicos para alguns tipos primitivos: `double`, `int` e `long`. Eles possuem a vantagem de evitar Boxing e Unboxing, e também fornecem alguns métodos mais especializados como vamos ver.
436+
437+
. É possível criar _Streams_ de tipos primitivos com as classes: `DoubleStream`, `IntStream` e `LongStream`.
438+
+
439+
[source,java,indent=0]
440+
.{java-package}/usingstreams/primitives/Streams_Primitives.java
441+
----
442+
include::{section-java-package}/usingstreams/primitives/Streams_Primitives.java[tag=code]
443+
----
444+
+
445+
.Saída no console
446+
[source,console]
447+
----
448+
DoubleStream
449+
1.12.23.3
450+
IntStream
451+
123
452+
123
453+
LongStream
454+
123
455+
123
456+
----
457+
458+
. É possível transformar um _Stream_ comum em um _Stream_ de primitivos utilizando as operações `mapTo*`.
459+
+
460+
[source,java,indent=0]
461+
.{java-package}/usingstreams/primitives/Streams_MapTo.java
462+
----
463+
include::{section-java-package}/usingstreams/primitives/Streams_MapTo.java[tag=code]
464+
----
465+
+
466+
.Saída no console
467+
[source,console]
468+
----
469+
Stream para IntStream
470+
1234
471+
Stream para LongStream
472+
1234
473+
Stream para DoubleStream
474+
1.02.03.04.0
475+
----
476+
477+
. É possível gerar Streams infinitos com o método `generate`.
478+
+
479+
[source,java,indent=0]
480+
.{java-package}/usingstreams/primitives/Streams_Generate.java
481+
----
482+
include::{section-java-package}/usingstreams/primitives/Streams_Generate.java[tag=code]
483+
----
484+
+
485+
.Saída no console
486+
[source,console]
487+
----
488+
IntStream infinito de números aleatórios
489+
2111846625
490+
-1692075394
491+
122693397
492+
493+
DoubleStream infinito de números aleatórios
494+
0.913037010633669
495+
0.23669861350384735
496+
0.32655918031847697
497+
----
498+
+
499+
Nesse caso os _Streams_ são realmente infinitos. Só foram apresentados 3 números de cada pois existe a operação `limit`, caso contrário a execução do programa também seria sem fim.
500+
501+
. É possível utilizar a operação `rangeClosed` ao invés de `range`, deixando o código mais legível.
502+
+
503+
[source,java,indent=0]
504+
.{java-package}/usingstreams/primitives/Streams_RangeClosed.java
505+
----
506+
include::{section-java-package}/usingstreams/primitives/Streams_RangeClosed.java[tag=code]
507+
----
508+
+
509+
.Saída no console
510+
[source,console]
511+
----
512+
123
513+
1234
514+
----
515+
+
516+
Perceba que na chamada utilizando `range`, o último número é exclusivo (não faz parte do _Stream_). No `rangeClosed`, tanto o primeiro quanto o último número são inclusivos (fazem parte do _Stream_).
517+
518+
. É possível gerar várias estatísticas de _Streams_ utilizando a operação `summaryStatistics`.
519+
+
520+
[source,java,indent=0]
521+
.{java-package}/usingstreams/primitives/Streams_Statistics.java
522+
----
523+
include::{section-java-package}/usingstreams/primitives/Streams_Statistics.java[tag=code]
524+
----
525+
+
526+
.Saída no console
527+
[source,console]
528+
----
529+
Quantidade: 10
530+
Maior: 9
531+
Menor: 0
532+
Soma: 45
533+
Média: 4.5
534+
----
440535

441536
==== Collectors
442537

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.j6toj8.streams.usingstreams.primitives;
2+
3+
import java.util.Random;
4+
import java.util.stream.DoubleStream;
5+
import java.util.stream.IntStream;
6+
7+
public class Streams_Generate {
8+
9+
public static void main(String[] args) {
10+
// tag::code[]
11+
// Cria Stream infinito de números aleatórios
12+
System.out.println(" IntStream infinito de números aleatórios");
13+
IntStream.generate(() -> new Random().nextInt())
14+
.limit(3)
15+
.forEach(System.out::println);
16+
17+
System.out.println("\n DoubleStream infinito de números aleatórios");
18+
DoubleStream.generate(Math::random)
19+
.limit(3)
20+
.forEach(System.out::println);
21+
// end::code[]
22+
}
23+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.j6toj8.streams.usingstreams.primitives;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
6+
public class Streams_MapTo {
7+
8+
public static void main(String[] args) {
9+
// tag::code[]
10+
List<Integer> list = Arrays.asList(1, 2, 3, 4);
11+
12+
System.out.println(" Stream para IntStream");
13+
list.stream() // cria Stream<Integer>
14+
.mapToInt(Integer::intValue) // transforma em IntStream
15+
.forEach(System.out::print);
16+
17+
System.out.println("\n Stream para LongStream");
18+
list.stream() // cria Stream<Long>
19+
.mapToLong(Integer::longValue) // transforma em LongStream
20+
.forEach(System.out::print);
21+
22+
System.out.println("\n Stream para DoubleStream");
23+
list.stream() // cria Stream<Double>
24+
.mapToDouble(Integer::doubleValue) // transforma em DoubleStream
25+
.forEach(System.out::print);
26+
// end::code[]
27+
}
28+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.j6toj8.streams.usingstreams.primitives;
2+
3+
import java.util.stream.DoubleStream;
4+
import java.util.stream.IntStream;
5+
import java.util.stream.LongStream;
6+
7+
public class Streams_Primitives {
8+
9+
public static void main(String[] args) {
10+
// tag::code[]
11+
System.out.println(" DoubleStream");
12+
DoubleStream.of(1.1, 2.2, 3.3).forEach(System.out::print);
13+
14+
System.out.println("\n IntStream");
15+
IntStream.of(1, 2, 3).forEach(System.out::print);
16+
System.out.println();
17+
IntStream.range(1, 4).forEach(System.out::print);
18+
19+
System.out.println("\n LongStream");
20+
LongStream.of(1, 2, 3).forEach(System.out::print);
21+
System.out.println("");
22+
LongStream.range(1, 4).forEach(System.out::print);
23+
// end::code[]
24+
}
25+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.j6toj8.streams.usingstreams.primitives;
2+
3+
import java.util.stream.IntStream;
4+
5+
public class Streams_RangeClosed {
6+
7+
public static void main(String[] args) {
8+
// tag::code[]
9+
IntStream.range(1, 4).forEach(System.out::print);
10+
System.out.println();
11+
IntStream.rangeClosed(1, 4).forEach(System.out::print);
12+
// end::code[]
13+
}
14+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.j6toj8.streams.usingstreams.primitives;
2+
3+
import java.util.IntSummaryStatistics;
4+
import java.util.stream.IntStream;
5+
6+
public class Streams_Statistics {
7+
8+
public static void main(String[] args) {
9+
// tag::code[]
10+
IntSummaryStatistics summaryStatistics = IntStream.range(0, 10).summaryStatistics();
11+
System.out.println("Quantidade: " + summaryStatistics.getCount());
12+
System.out.println("Maior: " + summaryStatistics.getMax());
13+
System.out.println("Menor: " + summaryStatistics.getMin());
14+
System.out.println("Soma: " + summaryStatistics.getSum());
15+
System.out.println("Média: " + summaryStatistics.getAverage());
16+
// end::code[]
17+
}
18+
}

0 commit comments

Comments
 (0)