Develop code to extract data from an object using peek() and map() methods including primitive versions of the map() method

🎯 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étodoRetornoExemplo 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étodoPara quê?Tipo de retorno
map()Transformar objetosStream<R>
peek()Ver dados no pipeline (debug)Stream<T> (mesmo tipo)
mapToInt()Extrair valores intIntStream
mapToDouble()Extrair valores doubleDoubleStream
mapToLong()Extrair valores longLongStream

🧠 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úsculas
  • peek() imprime os valores resultantes
  • collect() é operação terminal

✅ 2. D) Todas as anteriores

  • Todas usam map() corretamente
  • Mesmo mapToDouble() (desde que a função retorne double), 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> ou DoubleStream, 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 nomes
  • map() converte para inteiros
  • forEach() imprime os números

✅ 7. B) DoubleStream

  • mapToDouble() retorna um DoubleStream, que tem métodos como average(), 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 tamanhos
  • sum() faz a operação final

✅ 10. A, B, D

  • mapToInt, mapToDouble, mapToLong existem
  • Não existe mapToFloat

Deixe um comentário