Em que se base as expressões lambda?
sobes.tech IA
Resposta da IA
Baseado no mecanismo Invoke Dynamic (JSR 292). Permite adiar a resolução de chamadas de métodos até ao momento da execução. Isto torna as lambdas mais flexíveis e eficientes do que usar classes internas anónimas para interfaces funcionais simples.
O compilador Java converte a expressão lambda numa construção específica que usa o método estático lambda$(), chamado através de invokedynamic.
Exemplo:
// Interface funcional
interface MyFunctionalInterface {
void myMethod();
}
// Uso de lambda
public class LambdaExample {
public static void main(String[] args) {
MyFunctionalInterface myLambda = () -> System.out.println("Olá do lambda!");
myLambda.myMethod();
}
}
Após a compilação, o código com a lambda parecerá aproximadamente assim (em bytecode):
invokedynamic #0:myMethod:()V()LI; // BootstrapMethod:lambda$0
astore_1
aload_1
invokeinterface MyFunctionalInterface.myMethod:()V interface 1
O método bootstrap (de carregamento inicial) para invokedynamic decide qual método chamar. No caso das lambdas, geralmente é java.lang.invoke.LambdaMetafactory.metafactory(), que gera a classe e a instância da interface funcional em tempo de execução, vinculando-a à implementação da lambda (neste caso, o método estático lambda$0).
Esta abordagem reduz os custos de criar múltiplas classes internas anónimas para lambdas simples, melhorando o desempenho e o uso de memória, especialmente em coleções e streams.