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.