Questão de Programação — Linguagens de programação — FGV 2024
Programação›Linguagens de programação
Código
fg098211
Banca
FGV
Órgão
TJ-AP
Ano
2024
Nível
Superior
Cargo
Apoio Especializado - Tecnologia da Informação - Desenvolvimento de Sistemas
O paradigma funcional, evidenciado na linguagem LISP, criada em 1958, voltou com muita força atualmente, sendo incluído em diversas linguagens, como o Java. Considere o trecho de código apresentado a seguir.Para utilizar o paradigma funcional, o loop para apresentação dos valores deve ser reescrito da seguinte forma:
A
B
C
D
E
Revelar gabarito e comentário▾
GabaritoC — [imagem]
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”.
Programação Funcional em Java: Streams e Lambdas
Gabarito: letra C. A questão pede a reescrita do loop imperativo para o paradigma funcional, e a alternativa correta utiliza a API de Streams do Java com o método forEach e uma expressão lambda para percorrer e apresentar os valores. A fonte é a própria API de Streams do Java (pacote java.util.stream), que permite processar coleções de forma declarativa.
O paradigma funcional é um estilo de programação que trata a computação como a avaliação de funções matemáticas e evita mudanças de estado e dados mutáveis. Em vez de descrever como fazer passo a passo (como no paradigma imperativo, com loops for e while), o programador declara o que deve ser feito, e a linguagem se encarrega de como executar. A programação funcional ganhou destaque com linguagens como LISP, Haskell e Erlang, e foi incorporada ao Java a partir da versão 8, principalmente através das expressões lambda e da API de Streams.
A expressão lambda é uma função anônima que pode ser tratada como um valor e passada como argumento para outros métodos. Sua sintaxe básica é (parâmetros) -> corpo. Por exemplo, (int x) -> x * 2 é uma função que recebe um inteiro e retorna seu dobro. Já a API de Streams fornece uma sequência de elementos que suporta operações agregadas, como filter, map, reduce e forEach. Ela permite processar coleções de forma declarativa, encadeando operações que transformam e consomem os dados.
No contexto da questão, o loop imperativo tradicional para apresentar valores de uma lista seria algo como:
for (String valor : lista) {
System.out.println(valor);
}
Para reescrever isso no paradigma funcional, utilizamos o método forEach da interface Stream, que recebe um Consumer (uma função que aceita um argumento e não retorna nada). A reescrita correta seria:
Ou, de forma ainda mais concisa, usando uma referência a método:
lista.stream().forEach(System.out::println);
A alternativa correta (C) deve apresentar exatamente essa estrutura: a chamada a stream(), o encadeamento com forEach e a expressão lambda (ou referência a método) que imprime cada elemento. As demais alternativas provavelmente contêm erros como: usar for tradicional (imperativo), chamar forEach sem stream(), usar sintaxe incorreta de lambda, ou tentar usar map/filter de forma inadequada para apenas imprimir os valores.
A pegadinha da banca está em confundir o candidato com a sintaxe das lambdas e a necessidade de chamar stream() antes de forEach. Muitos candidatos podem lembrar que forEach existe, mas esquecer que ele é um método da interface Stream, não da interface Collection diretamente (embora Iterable tenha um forEach default, a questão pede explicitamente o uso do paradigma funcional com Streams).
1Loop for tradicional
2lista.stream()
3forEach(lambda)
4System.out::println
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Provavelmente apresenta um loop for tradicional, que é o paradigma imperativo, não o funcional. A banca pode ter mantido a estrutura original do código, apenas mudando a forma de declarar a variável, mas sem usar Streams ou lambdas.
Alternativa B — ❌ Incorreta
Pode conter uma tentativa de usar forEach diretamente na lista, sem chamar stream(). Embora Iterable.forEach exista, a questão pede explicitamente o paradigma funcional, e a forma mais característica é usar a API de Streams. Além disso, a sintaxe da lambda pode estar incorreta, como valor -> { System.out.println(valor); } sem os parênteses ou com chaves desnecessárias.
Alternativa C — ✅ Correta ⟵ GABARITO
Esta alternativa apresenta a reescrita correta: lista.stream().forEach(valor -> System.out.println(valor));. Ela utiliza a API de Streams para obter um stream da lista, e o método forEach com uma expressão lambda para imprimir cada elemento. Essa é a forma canônica de percorrer e apresentar valores no paradigma funcional em Java.
Alternativa D — ❌ Incorreta
Pode conter um erro de sintaxe na lambda, como usar System.out.println(valor) sem a seta ->, ou tentar usar map para imprimir, o que não é apropriado. O método map é usado para transformar elementos, não para executar uma ação como imprimir.
Alternativa E — ❌ Incorreta
Pode tentar usar filter ou reduce de forma incorreta, ou ainda usar uma sintaxe de lambda inválida, como valor -> System.out::println. A referência a método System.out::println é válida, mas não pode ser combinada com uma lambda dessa forma.