Sobes.tech
Middle

Lambda ifodalarining asosiy manbai nima?

sobes.tech AI

AIdan javob

Invoke Dynamic (JSR 292) mexanizmi asosida. Bu, metod chaqiruvlarini bajarilish vaqtiga qadar hal qilishni kechiktirish imkonini beradi. Bu, oddiy funksional interfeyslar uchun noma'lum ichki sinflardan foydalanishga nisbatan lambdalarni ko'proq moslashuvchan va samarali qiladi.

Java kompilyatori lambda ifodasini lambda$() nomli statik metodni ishlatadigan maxsus tuzilishga aylantiradi va bu invokedynamic orqali chaqiriladi.

Misol:

// Funktsional interfeys
interface MyFunctionalInterface {
    void myMethod();
}

// Lambda ishlatish
public class LambdaExample {
    public static void main(String[] args) {
        MyFunctionalInterface myLambda = () -> System.out.println("Lambda dan Salom!");
        myLambda.myMethod();
    }
}

Kompilyatsiyadan so'ng, lambda bilan kod taxminan quyidagicha ko'rinadi (bytecode):

  invokedynamic #0:myMethod:()V()LI; // BootstrapMethod:lambda$0
  astore_1
  aload_1
  invokeinterface MyFunctionalInterface.myMethod:()V interface 1

invokedynamic uchun bootstrap metod ( boshlang'ich yuklash usuli) qaysi metodni chaqirishni hal qiladi. Lambda holatida, odatda, java.lang.invoke.LambdaMetafactory.metafactory() ishlatiladi, bu bajarilish vaqtida funksional interfeys sinfini va nusxasini yaratadi va uni lambda ijrosiga bog'laydi (bu holatda, statik metod lambda$0).

Ushbu yondashuv oddiy lambdalar uchun ko'p miqdordagi noma'lum ichki sinflar yaratish xarajatlarini kamaytiradi, ishlash samaradorligini va xotira foydalanishni yaxshilaydi, ayniqsa kolleksiyalar va oqimlar (streams) bilan ishlashda.