Sobes.tech
Middle

Worauf basieren Lambda-Ausdrücke?

sobes.tech KI

Antwort von AI

Basierend auf dem Invoke Dynamic-Mechanismus (JSR 292). Es ermöglicht, die Auflösung von Methodenausrufen bis zur Ausführung zu verzögern. Dies macht Lambdas flexibler und leistungsfähiger als die Verwendung von anonymen inneren Klassen für einfache funktionale Schnittstellen.

Der Java-Compiler wandelt Lambda-Ausdrücke in eine spezielle Konstruktion um, die die statische Methode lambda$() verwendet, die über invokedynamic aufgerufen wird.

Beispiel:

// Funktionale Schnittstelle
interface MyFunctionalInterface {
    void myMethod();
}

// Verwendung eines Lambda-Ausdrucks
public class LambdaExample {
    public static void main(String[] args) {
        MyFunctionalInterface myLambda = () -> System.out.println("Hallo aus der Lambda!");
        myLambda.myMethod();
    }
}

Nach der Kompilierung sieht der Code mit Lambda ungefähr so aus (im Bytecode):

  invokedynamic #0:myMethod:()V()LI; // BootstrapMethod:lambda$0
  astore_1
  aload_1
  invokeinterface MyFunctionalInterface.myMethod:()V interface 1

Die Bootstrap-Methode (Initialisierungsmethode) für invokedynamic entscheidet, welche Methode aufgerufen wird. Bei Lambdas ist dies in der Regel java.lang.invoke.LambdaMetafactory.metafactory(), die zur Laufzeit die Klasse und die Instanz der funktionalen Schnittstelle generiert und sie mit der Lambda-Implementierung verbindet (in diesem Fall die statische Methode lambda$0).

Dieser Ansatz reduziert die Kosten für die Erstellung vieler anonymer innerer Klassen für einfache Lambdas, verbessert die Leistung und den Speicherverbrauch, insbesondere bei Collections und Streams.