Sobes.tech
Middle

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.