Sobes.tech
Middle

A lambda kifejezések miben alapulnak?

sobes.tech MI

Válasz az MI-től

Az Invoke Dynamic (JSR 292) mechanizmuson alapul. Lehetővé teszi a metódushívások megoldásának késleltetését a végrehajtás pillanatáig. Ez rugalmasabbá és hatékonyabbá teszi a lambdákat, mint az egyszerű funkcionális interfészekhez használt névtelen belső osztályok.

A Java fordító a lambda kifejezést egy speciális konstrukcióvá alakítja, amely a lambda$() nevű statikus metódust használja, amit az invokedynamic hív meg.

Példa:

// Funkcionális interfész
interface MyFunctionalInterface {
    void myMethod();
}

// Lambda használat
public class LambdaExample {
    public static void main(String[] args) {
        MyFunctionalInterface myLambda = () -> System.out.println("Helló a lambdából!");
        myLambda.myMethod();
    }
}

A fordítás után a lambda-t tartalmazó kód nagyjából így néz ki (bytecode-ban):

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

A bootstrap metódus (kezdeti betöltő metódus) az invokedynamic esetén eldönti, melyik metódust hívja meg. Lambdák esetén általában a java.lang.invoke.LambdaMetafactory.metafactory() metódus, amely a futásidőben generálja a funkcionális interfész osztályát és példányát, összekapcsolva azt a lambda implementációjával (ebben az esetben a lambda$0 statikus metódussal).

Ez a megközelítés csökkenti az egyszerű lambdákhoz tartozó sok névtelen belső osztály létrehozásának költségét, javítva a teljesítményt és a memóriahasználatot, különösen gyűjteményekben és stream-ekben.