Waarop zijn lambda-uitdrukkingen gebaseerd?
sobes.tech AI
Antwoord van AI
Gebaseerd op het Invoke Dynamic-mechanisme (JSR 292). Het stelt je in staat om methodenaanroepen uit te stellen tot het moment van uitvoering. Dit maakt lambdas flexibeler en efficiënter dan het gebruik van anonieme interne klassen voor eenvoudige functionele interfaces.
De Java-compiler zet lambda-uitdrukkingen om in een specifieke constructie die gebruikmaakt van de statische methode lambda$(), die wordt aangeroepen via invokedynamic.
Voorbeeld:
// Functionele interface
interface MyFunctionalInterface {
void myMethod();
}
// Gebruik van lambda
public class LambdaExample {
public static void main(String[] args) {
MyFunctionalInterface myLambda = () -> System.out.println("Hallo vanaf lambda!");
myLambda.myMethod();
}
}
Na compilatie ziet de code met lambda er ongeveer zo uit (in bytecode):
invokedynamic #0:myMethod:()V()LI; // BootstrapMethod:lambda$0
astore_1
aload_1
invokeinterface MyFunctionalInterface.myMethod:()V interface 1
De bootstrap-methode (initiatief methode) voor invokedynamic bepaalt welke methode wordt aangeroepen. In het geval van lambdas is dat meestal java.lang.invoke.LambdaMetafactory.metafactory(), die de klasse en instantie van de functionele interface genereert tijdens runtime, en deze koppelt aan de lambda-implementatie (in dit geval de statische methode lambda$0).
Deze aanpak vermindert de kosten voor het maken van meerdere anonieme interne klassen voor eenvoudige lambdas, verbetert de prestaties en het geheugenverbruik, vooral in collecties en streams.