Considere a sentença a seguir. for(I i: new I[] {x-> x...

Próximas questões
Com base no mesmo assunto
Q873514 Programação
Considere a sentença a seguir.
for(I i: new I[] {x-> x+2, (x)->x*2 }) System.out.println(i.c(2));
Dada a interface I, interface I{int c(int i);}, essa sentença
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Alternativa correta: C - produz os valores 4 e 4 na saída padrão.

Para compreender a questão, é necessário ter conhecimento sobre o uso de expressões lambda em Java, as quais permitem representar instâncias de interfaces funcionais (interfaces com um único método abstrato) de maneira concisa. A interface I definida na sentença é uma interface funcional, pois contém apenas um método abstrato c(int i).

Na linha de código fornecida, um loop for-each é utilizado para iterar sobre um array de duas expressões lambda que implementam a interface I. Cada expressão lambda define uma implementação diferente do método c:

  • A primeira expressão x -> x + 2, quando chamada com o valor 2, retorna 2 + 2, ou seja, 4.
  • A segunda expressão (x) -> x * 2, quando chamada com o valor 2, retorna 2 * 2, ou seja, 4.

O método System.out.println() é chamado para cada expressão lambda, imprimindo o resultado do método c aplicado ao valor 2. Portanto, dois valores 4 são impressos sucessivamente na saída padrão.

Por essa razão, a alternativa C está correta, pois o código compila corretamente, executa sem gerar exceções e imprime os valores 4 e 4 na saída padrão, conforme a implementação das expressões lambda fornecidas.

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

Preciso de ajuda para entender esse código

Nunca na vida vi um código igual esse.

Ele tá usando o lambda do Java 8 com classe anônima.

Reescrevendo o código de forma extensa:

-------------------------------------------------------------------------------

// primeira classe anônima 

I i1 = new I() {

      public int c(int x) {

            return x+2;

      }

};

// segunda classe anônima

I i2 = new I() {

      public int c(int x) {

            return x*2;

      }

};

// adiciona os objetos num array e percorre no for

I[] list = {i1, i2};

for (I i : list) {

      System.out.println(i.c(2));

}

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo