Sobes.tech
Middle

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.