Sobes.tech
Middle

Na čemu se zasnivaju lambda izrazi?

sobes.tech АИ

Одговор од АИ

Bazirano na mehanizmu Invoke Dynamic (JSR 292). Omogućava odlaganje rešavanja poziva metoda do trenutka izvršenja. To čini lambde fleksibilnijim i efikasnijim od korišćenja anonimnih unutrašnjih klasa za jednostavne funkcionalne interfejse.

Java kompajler pretvara lambda izraz u specifičnu konstrukciju koja koristi statičku metodu lambda$(), koja se poziva putem invokedynamic.

Primer:

// Funkcionalni interfejs
interface MyFunctionalInterface {
    void myMethod();
}

// Korišćenje lambde
public class LambdaExample {
    public static void main(String[] args) {
        MyFunctionalInterface myLambda = () -> System.out.println("Zdravo iz lambde!");
        myLambda.myMethod();
    }
}

Nakon kompilacije, kod sa lambdom će izgledati otprilike ovako (u bajtkodu):

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

Bootstrap metoda (metod inicijalnog učitavanja) za invokedynamic odlučuje koju metodu pozvati. U slučaju lambdi, to je obično java.lang.invoke.LambdaMetafactory.metafactory(), koja generiše klasu i instancu funkcionalnog interfejsa tokom izvršenja, povezujući je sa implementacijom lambde (u ovom slučaju, statičkom metodom lambda$0).

Ovaj pristup smanjuje troškove kreiranja više anonimnih unutrašnjih klasa za jednostavne lambde, poboljšava performanse i korišćenje memorije, posebno u kolekcijama i streamovima.