Lambda ifadələri nə əsasında işləyir?
sobes.tech Süni İntellekt
AI-dan cavab
Invoke Dynamic mexanizminə əsaslanır (JSR 292). Bu, metod çağırışlarının həllini icra zamanı təxirə salmağa imkan verir. Bu, sadə funksional interfeyslər üçün anonim daxili siniflərdən istifadə etməyə nisbətən lambda ifadələrini daha çevik və səmərəli edir.
Java tərtibçisi lambda ifadəsini lambda$() adlı statik metoddan istifadə edən xüsusi bir quruluşa çevirir və bu, invokedynamic vasitəsilə çağırılır.
Nümunə:
// Funksional interfeys
interface MyFunctionalInterface {
void myMethod();
}
// Lambda istifadəsi
public class LambdaExample {
public static void main(String[] args) {
MyFunctionalInterface myLambda = () -> System.out.println("Lambda-dan salam!");
myLambda.myMethod();
}
}
Tərtibdən sonra, lambda ilə kod təxminən belə görünəcək (bytecode-də):
invokedynamic #0:myMethod:()V()LI; // BootstrapMethod:lambda$0
astore_1
aload_1
invokeinterface MyFunctionalInterface.myMethod:()V interface 1
invokedynamic üçün bootstrap metodu (başlanğıc metodu) hansı metodun çağırılacağını qərar verir. Lambda halında, adətən, java.lang.invoke.LambdaMetafactory.metafactory() istifadə olunur, bu, icra zamanı funksional interfeys sinfi və nümunəsini yaradır və onu lambda implementasiyası ilə bağlayır (bu halda, statik metod lambda$0).
Bu yanaşma, sadə lambdalar üçün çoxsaylı anonim daxili sinflər yaratma xərclərini azaldır, performansı və yaddaş istifadəsini yaxşılaşdırır, xüsusən kolleksiyalar və axınlar (streams) ilə işləyərkən.