Pular para o conteúdo principal

Questão de Programação — Linguagens de programação — FGV 2024

ProgramaçãoLinguagens 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.Imagem associada para resolução da questãoPara utilizar o paradigma funcional, o loop para apresentação dos valores deve ser reescrito da seguinte forma:
  1. AImagem associada para resolução da questão
  2. BImagem associada para resolução da questão
  3. CImagem associada para resolução da questão
  4. DImagem associada para resolução da questão
  5. EImagem associada para resolução da questão
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:

lista.stream().forEach(valor -> System.out.println(valor));

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).

  1. 1Loop for tradicional
  2. 2lista.stream()
  3. 3forEach(lambda)
  4. 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.

Gabarito: letra C

Link permanente: /questoes/fg098211