Pe ce se bazează expresiile lambda?
sobes.tech AI
Răspuns de la AI
Bazat pe mecanismul Invoke Dynamic (JSR 292). Permite amânarea rezolvării apelurilor de metode până în momentul execuției. Acest lucru face ca lambdas să fie mai flexibile și mai eficiente decât utilizarea claselor interne anonime pentru interfețe funcționale simple.
Compilatorul Java convertește expresia lambda într-o construcție specifică care utilizează metoda statică lambda$(), apelată prin invokedynamic.
Exemplu:
// Interfață funcțională
interface MyFunctionalInterface {
void myMethod();
}
// Utilizarea lambda
public class LambdaExample {
public static void main(String[] args) {
MyFunctionalInterface myLambda = () -> System.out.println("Salut din lambda!");
myLambda.myMethod();
}
}
După compilare, codul cu lambda va arăta aproximativ așa (în bytecode):
invokedynamic #0:myMethod:()V()LI; // BootstrapMethod:lambda$0
astore_1
aload_1
invokeinterface MyFunctionalInterface.myMethod:()V interface 1
Metoda bootstrap (metoda de încărcare inițială) pentru invokedynamic decide ce metodă să fie apelată. În cazul lambdas, de obicei, este java.lang.invoke.LambdaMetafactory.metafactory(), care generează clasa și instanța interfeței funcționale în timpul execuției, legând-o de implementarea lambda (în acest caz, metoda statică lambda$0).
Această abordare reduce costurile de creare a multor clase interne anonime pentru lambdas simple, îmbunătățind performanța și utilizarea memoriei, în special în colecții și stream-uri.