Na čom sú založené lambda výrazy?
sobes.tech AI
Odpoveď od AI
Na základe mechanizmu Invoke Dynamic (JSR 292). Umožňuje odložiť riešenie volania metód až do okamihu vykonania. To robí lambdy flexibilnejšími a efektívnejšími ako použitie anonymných vnútorných tried pre jednoduché funkčné rozhrania.
Java prekladač transformuje lambda výraz na špecifickú konštrukciu, ktorá využíva statickú metódu lambda$(), volanú cez invokedynamic.
Príklad:
// Funkčné rozhranie
interface MyFunctionalInterface {
void myMethod();
}
// Použitie lambdy
public class LambdaExample {
public static void main(String[] args) {
MyFunctionalInterface myLambda = () -> System.out.println("Ahoj z lambdy!");
myLambda.myMethod();
}
}
Po kompilácii bude kód s lambdou vyzerať približne takto (v bytecode):
invokedynamic #0:myMethod:()V()LI; // BootstrapMethod:lambda$0
astore_1
aload_1
invokeinterface MyFunctionalInterface.myMethod:()V interface 1
Bootstrap metóda (metóda počiatočného načítania) pre invokedynamic rozhodne, ktorú metódu zavolať. V prípade lambd je to zvyčajne java.lang.invoke.LambdaMetafactory.metafactory(), ktorá generuje triedu a inštanciu funkčného rozhrania počas behu, spájajúc ju s implementáciou lambdy (v tomto prípade, statickou metódou lambda$0).
Tento prístup znižuje náklady na vytváranie viacerých anonymných vnútorných tried pre jednoduché lambdy, zlepšuje výkon a využitie pamäte, najmä v kolekciách a streamoch.