Na čem jsou založeny lambda výrazy?
sobes.tech AI
Odpověď od AI
Na základě mechanismu Invoke Dynamic (JSR 292). Umožňuje odložit řešení volání metod až do okamžiku provádění. To činí lambdy flexibilnějšími a výkonnějšími než použití anonymních vnitřních tříd pro jednoduché funkční rozhraní.
Java překladač převádí lambda výraz na specifickou konstrukci využívající statickou metodu lambda$(), která je volána přes invokedynamic.
Příklad:
// Funkční rozhraní
interface MyFunctionalInterface {
void myMethod();
}
// Použití lambda
public class LambdaExample {
public static void main(String[] args) {
MyFunctionalInterface myLambda = () -> System.out.println("Ahoj z lambda!");
myLambda.myMethod();
}
}
Po kompilaci bude kód s lambdou vypadat přibližně takto (v bytecode):
invokedynamic #0:myMethod:()V()LI; // BootstrapMethod:lambda$0
astore_1
aload_1
invokeinterface MyFunctionalInterface.myMethod:()V interface 1
Bootstrap metoda (počáteční načítací metoda) pro invokedynamic rozhodne, kterou metodu zavolat. V případě lambd je to obvykle java.lang.invoke.LambdaMetafactory.metafactory(), která generuje třídu a instanci funkčního rozhraní za běhu, spojujíc ji s implementací lambdy (v tomto případě statickou metodou lambda$0).
Tento přístup snižuje náklady na vytváření mnoha anonymních vnitřních tříd pro jednoduché lambdy, zlepšuje výkon a využití paměti, zejména v kolekcích a streamech.