🎯 Objetivo da prova
Esse tópico foca no uso das Streams, principalmente os métodos:
map()→ transforma os elementos.peek()→ inspeciona os elementos durante o pipeline (para debug, logs, etc.).- Versões primitivas:
mapToInt(),mapToDouble(),mapToLong().
✅ 1. Revisando map()
✨ O que é?
map(Function) transforma (ou extrai) valores da stream. A função passada define como o valor será transformado.
📦 Exemplo comum:
List<String> nomes = List.of("Ana", "Carlos", "Beatriz");
Stream<Integer> tamanhos =
nomes.stream()
.map(nome -> nome.length());
// transforma String em Integer
tamanhos.forEach(System.out::println);
// 3, 6, 7
✅ 2. Usando peek()
✨ O que é?
peek(Consumer) serve para ver o valor da stream em determinado ponto (normalmente usado para debug ou logging).
⚠️ Observação:
peek()não altera os elementos.- Só é executado se houver uma operação terminal (
forEach,collect,count, etc).
📦 Exemplo:
List<String> nomes = List.of("Ana", "Carlos");
nomes.stream()
.peek(nome -> System.out.println("Original: " + nome))
.map(nome -> nome.toUpperCase())
.peek(nome -> System.out.println("Convertido: " + nome))
.forEach(System.out::println);
✅ 3. Versões primitivas do map()
Para evitar autoboxing, temos versões otimizadas para tipos primitivos:
| Método | Retorno | Exemplo de uso |
|---|---|---|
mapToInt() | IntStream | .mapToInt(s -> s.length()) |
mapToDouble() | DoubleStream | .mapToDouble(p -> p.getSalario()) |
mapToLong() | LongStream | .mapToLong(x -> x.getId()) |
📦 Exemplo:
List<String> nomes = List.of("Ana", "Carlos");
int somaDosCaracteres = nomes.stream()
.mapToInt(String::length)
// transforma para IntStream
.sum(); // soma os valores
System.out.println(somaDosCaracteres);
// 3 + 6 = 9
🚫 Exemplo incorreto (pegadinha de prova):
Stream<String> stream = Stream.of("A", "B");
stream.mapToInt(s -> s.length());
stream.forEach(System.out::println);// ERRO! Stream já foi consumida
⚠️ Uma stream só pode ser usada uma vez.
🎓 Resumo prático:
| Método | Para quê? | Tipo de retorno |
|---|---|---|
map() | Transformar objetos | Stream<R> |
peek() | Ver dados no pipeline (debug) | Stream<T> (mesmo tipo) |
mapToInt() | Extrair valores int | IntStream |
mapToDouble() | Extrair valores double | DoubleStream |
mapToLong() | Extrair valores long | LongStream |
🧠 Exercícios de múltipla escolha
🧪 1. O que será impresso?
List<String> nomes = List.of("Ana", "Pedro");
nomes.stream()
.map(String::toUpperCase)
.peek(System.out::println)
.collect(Collectors.toList());
A) ANA
B) PEDRO
C) ANA PEDRO
D) Nada será impresso
🧪 2. Qual das opções usa map() corretamente?
A) stream.mapToDouble(x -> x.length())
B) stream.map(x -> x.toString())
C) stream.map(x -> x + 1.0)
D) Todas as anteriores
🧪 3. O que ocorre neste código?
Stream<String> s = Stream.of("a", "b", "c");
s.map(String::toUpperCase);
s.forEach(System.out::println);
A) a b c
B) A B C
C) Erro de compilação
D) a b c (porque map() não foi encadeado)
🧪 4. Qual das seguintes gera um IntStream?
A) list.stream().mapToInt(s -> s.length())
B) list.stream().map(s -> s.length())
C) list.stream().mapToDouble(s -> s.length())
D) list.stream().map(String::length)
🧪 5. Qual alternativa está incorreta sobre peek()?
A) Pode ser usado para depuração sem alterar os dados
B) Exige uma operação terminal para ser executado
C) Pode modificar os dados da stream
D) É do tipo intermediate (intermediária)
🧪 6. O que será impresso?
List<String> nomes =List.of("Ana", "Bob", "Clara");
nomes.stream()
.peek(s -> System.out.print("[" + s + "]"))
.map(String::length)
.forEach(System.out::println);
A) [Ana][Bob][Clara] 3 3 5
B) 3 3 5
C) [Ana]3 [Bob]3 [Clara]5
D) Nada, pois peek não funciona com map
🧪 7. Qual é o tipo de retorno de mapToDouble()?
A) Double
B) DoubleStream
C) Stream<Double>
D) double[]
🧪 8. O que esse código faz?
Stream<String> s = Stream.of("1", "2", "3");
int total = s.mapToInt(Integer::parseInt).sum();
System.out.println(total);
A) Soma os caracteres: 3
B) Soma os valores inteiros: 6
C) Compila, mas lança exceção
D) Soma inválida, erro de tipo
🧪 9. Qual é o resultado do código abaixo?
Stream<String> stream = Stream.of("abc", "de");
stream.mapToInt(String::length)
.peek(System.out::println)
.sum();
A) 3 2
B) 5
C) 3 2 5
D) Não compila
🧪 10. Quais versões primitivas de map() existem?
A) mapToInt
B) mapToDouble
C) mapToFloat
D) mapToLong
✅ Gabarito comentado
✅ 1. C) ANA PEDRO
map()transforma para maiúsculaspeek()imprime os valores resultantescollect()é operação terminal
✅ 2. D) Todas as anteriores
- Todas usam
map()corretamente - Mesmo
mapToDouble()(desde que a função retornedouble), está válido
✅ 3. D) a b c
- O
map()está isolado, sua transformação não é usada - O
forEach()consome a stream original
✅ 4. A) list.stream().mapToInt(s -> s.length())
- As outras retornam
Stream<Integer>ouDoubleStream, mas a pergunta quer IntStream
✅ 5. C) Pode modificar os dados da stream ❌
peek()não altera os dados, apenas permite “espiar”
✅ 6. A) [Ana][Bob][Clara] 3 3 5
peek()imprime os nomesmap()converte para inteirosforEach()imprime os números
✅ 7. B) DoubleStream
mapToDouble()retorna umDoubleStream, que tem métodos comoaverage(),sum(), etc.
✅ 8. B) Soma os valores inteiros: 6
- Os valores “1”, “2”, “3” são convertidos com
Integer::parseInt - Soma = 1 + 2 + 3 = 6
✅ 9. A) 3 2
peek()imprime os tamanhossum()faz a operação final
✅ 10. A, B, D
mapToInt,mapToDouble,mapToLongexistem- Não existe
mapToFloat