Sobes.tech
Middle

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.