🔹 O que é Stream?
A Stream em Java é uma sequência de elementos computados sob demanda, usando operações funcionais como filter, map, limit, sorted, collect, etc.
⚠️ Importante:
- Uma
Streamnão armazena dados - Ela não modifica a fonte original
- Permite processamento paralelo ou sequencial
- Usa lambda expressions
🧱 A Interface Stream<T>
Stream<String> stream = Stream.of("Ana", "Carlos", "João");
Ou a partir de uma coleção:
List<String> nomes = Arrays.asList("Ana", "Carlos");
Stream<String> stream = nomes.stream();
🧬 O que é uma Pipeline?
É a cadeia de operações realizadas em uma stream, composta por:
| Etapa | Exemplo | Tipo |
|---|---|---|
| Fonte (source) | list.stream() | Fonte |
| Intermediária | filter(), map() | Lazy |
| Terminal | forEach(), collect() | Executa |
Exemplo de pipeline:
List<String> nomes = Arrays.asList("Lucas", "Ana", "Pedro");
nomes.stream() // Fonte
.filter(n -> n.startsWith("A")) // Intermediária
.map(String::toUpperCase) // Intermediária
.forEach(System.out::println); // Terminal
✔️ Imprime ANA
🚧 Diferenças entre Operações
✅ Intermediárias:
- São lazy: não executam nada até chegar uma terminal
- Podem ser encadeadas
- Ex:
map,filter,limit,sorted,distinct
✅ Terminais:
- Executam o pipeline
- Só pode haver uma por pipeline
- Ex:
forEach,collect,reduce,count,anyMatch
🧠 Dicas de Prova
- Stream não armazena dados, ela só processa.
- Operações intermediárias são lazy, só executam quando houver terminal.
- Não é possível reusar uma stream após terminal (
IllegalStateException). map()transforma,filter()seleciona.- Evite usar
forEach()com lógica complexa; prefiracollect.
✅ Exemplo de uso correto:
List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> paresDobro = numeros.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * 2)
.collect(Collectors.toList());
System.out.println(paresDobro);
// [4, 8]
🚫 Exemplo errado (reutilização de stream):
Stream<String> s = Stream.of("a", "b", "c");
s.forEach(System.out::println);
s.forEach(System.out::println); //❌
// IllegalStateException
🧪 Quiz (10 questões)
1. Qual método inicia uma Stream a partir de uma lista?
a) create()
b) stream()
c) generate()
d) collect()
2. O que a operação map() faz?
a) Filtra elementos
b) Transforma elementos
c) Remove elementos
d) Ordena elementos
3. O que ocorre se não houver operação terminal?
a) A stream não é criada
b) Nada é executado
c) A stream lança erro
d) Os dados são alterados
4. O que é filter()?
a) Transforma elementos
b) Seleciona com base em condição
c) Coleta elementos
d) Remove duplicatas
5. O que a operação collect() faz?
a) Finaliza a stream sem retornar dados
b) Conta os elementos
c) Coleta os dados em uma coleção
d) Reutiliza a stream
6. Qual das alternativas não é uma operação terminal?
a) forEach()
b) map()
c) reduce()
d) collect()
7. O que distinct() faz?
a) Remove elementos nulos
b) Remove duplicados
c) Ordena a lista
d) Reverte a lista
8. Qual operação transforma Stream<T> em Stream<R>?
a) filter()
b) forEach()
c) map()
d) peek()
9. count() retorna:
a) Uma stream
b) Um booleano
c) Um long
d) Um int
10. O que acontece se você tentar reusar uma stream?
a) Reinicia do zero
b) Duplica os elementos
c) Lança exceção
d) É ignorado
✅ Gabarito Comentado
- b –
stream()cria uma stream a partir de uma lista. - b –
map()transforma elementos. - b – Stream é lazy, nada é executado sem terminal.
- b –
filter()filtra com base em uma condição booleana. - c –
collect()transforma a stream em uma coleção. - b –
map()é intermediária. - b –
distinct()remove duplicatas. - c –
map()transforma os tipos. - c –
count()retornalong. - c – Stream só pode ser usada uma vez; reutilização gera erro.
📌 Resumo
- A interface
Streampermite operar de forma funcional sobre coleções. - Pipelines são compostas por: fonte → intermediárias → terminal.
- Streams são lazy — só executam com terminal.
- Métodos como
map,filter,collect,reduce,forEachsão essenciais. - Cuidado ao tentar reutilizar uma stream.
🎯 RESUMO VISUAL: Stream Interface e Pipeline em Java 8
+----------------------+
| Fonte (Source) |
|----------------------|
| list.stream() |
| Stream.of(...) |
+----------------------+
|
v
+-------------------------+
| Operações Intermediárias|
|-------------------------|
| filter() |
| map() |
| sorted() |
| limit() |
| distinct() |
+-------------------------+
(Laziness - Encadeável)
|
v
+----------------------+
| Operação Terminal |
|----------------------|
| forEach() |
| collect() |
| count() |
| reduce() |
+----------------------+
(Executa o pipeline)
🔍 Exemplo prático do fluxo completo:
List<String> nomes =
Arrays.asList("Ana", "Bruno", "Alice", "Carlos");
List<String> resultado = nomes.stream() // Fonte
.filter(n -> n.startsWith("A")) // Intermediária
.map(String::toUpperCase) // Intermediária
.sorted() // Intermediária
.collect(Collectors.toList()); // Terminal
Resultado: [ALICE, ANA]
✅ DICAS RÁPIDAS:
map()transforma valores →Stream<T> → Stream<R>filter()seleciona com base embooleanforEach()executa ação (mas não retorna nada)collect()→ transforma a stream em lista, set, string etc- Sem terminal, nada é executado
- Stream não pode ser reutilizada