A API de Streams do Java 8 introduziu uma nova forma de processar coleções de dados de maneira declarativa e, opcionalmente, paralela. Considere o seguinte trecho de código:Assinale a opção que apresenta o valor da variável resultado, após a execução deste código.
A12
B24
C42
D36
E18
Revelar gabarito e comentário▾
GabaritoB — 24
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Resolução
Gabarito: letra B — a conta chega a 24 — alternativa B.
A ideia por trás
A API de Streams do Java 8 permite processar coleções de forma declarativa, encadeando operações em uma pipeline. Uma pipeline tem três partes: a fonte (a lista), as operações intermediárias (que transformam o stream e são 'preguiçosas', só executam quando uma operação terminal é chamada) e a operação terminal (que produz o resultado final).
As operações intermediárias mais comuns são: filter (seleciona elementos que satisfazem um predicado), map (transforma cada elemento), limit (restringe o número de elementos) e sorted (ordena). A operação terminal reduce combina os elementos em um único valor usando uma função de acumulação. No caso, reduce(0, Integer::sum) inicia o acumulador em 0 e soma cada elemento, resultando na soma total.
Esta questão cobra a ordem e a semântica das operações da pipeline. É preciso simular a execução passo a passo, respeitando que as operações intermediárias são aplicadas em sequência, mas de forma 'preguiçosa': o stream processa os elementos um a um, aplicando todas as operações intermediárias antes de passar para o próximo, até que a operação terminal seja satisfeita (no caso, até que limit(3) tenha coletado 3 elementos).
O que a questão dá
lista de inteiros: [1, 2, 3, 4, 5, 6, 7, 8] (do código, conforme imagem)
operação filter: seleciona números pares
operação map: multiplica cada número por 2
operação limit: restringe a 3 elementos
operação reduce: soma os elementos, começando em 0
O que queremos: o valor da variável resultado após a execução do código
Passo 1 — Selecionar os números pares
A primeira operação da pipeline é o filter, que decide quais elementos passam adiante. Precisamos aplicá-lo primeiro porque ele define o conjunto de elementos que as operações seguintes vão processar.
Por que esta fórmula: filter é uma operação intermediária que recebe um predicado (uma condição) e mantém apenas os elementos que a satisfazem. Aqui, o predicado é 'número par', ou seja, n % 2 == 0.
NÃO CAIA NESSA!
Esquecer que o filter é aplicado antes do map e do limit, e tentar filtrar depois de transformar.
Passo 2 — Multiplicar cada número por 2
Depois de filtrar, o map transforma cada elemento restante. É importante aplicar o map antes do limit, porque o limit corta a quantidade de elementos, e queremos que o corte aconteça sobre os valores já transformados.
Por que esta fórmula: map é uma operação intermediária que aplica uma função a cada elemento do stream, produzindo um novo stream com os resultados. Aqui, a função é 'multiplicar por 2', ou seja, n -> n * 2.
NÃO CAIA NESSA!
Aplicar o map antes do filter, o que mudaria completamente o resultado.
Passo 3 — Restringir aos três primeiros elementos
Agora que temos os valores transformados, o limit(3) corta o stream para os três primeiros elementos. Isso é necessário porque a operação terminal reduce vai somar apenas esses três.
Por que esta fórmula: limit é uma operação intermediária que limita o número de elementos do stream. Ela é aplicada após o map, então pega os três primeiros elementos do stream já transformado.
NÃO CAIA NESSA!
Aplicar o limit antes do map, o que pegaria os três primeiros números da lista original e depois filtraria e transformaria, resultando em um valor diferente.
Passo 4 — Somar os elementos restantes
A operação terminal reduce combina todos os elementos do stream em um único valor. Aqui, ela soma os três números que sobraram, começando com o acumulador em 0.
Por que esta fórmula: reduce(0, Integer::sum) é uma operação terminal que aplica uma função de acumulação a cada elemento, começando com o valor inicial 0. Integer::sum é uma referência de método que soma dois inteiros.
De onde vem cada valor: = definição: valor inicial do acumulador · = passo 3: primeiro elemento · = passo 3: segundo elemento · = passo 3: terceiro elemento
NÃO CAIA NESSA!
Esquecer de incluir o valor inicial 0, ou somar os elementos antes do limit, o que daria 4 + 8 + 12 + 16 = 40.