Considere a sentença a seguir. for(I i: new I[] {x-> x...
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
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, retorna2 + 2
, ou seja, 4. - A segunda expressão
(x) -> x * 2
, quando chamada com o valor 2, retorna2 * 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