Sobes.tech
Middle

Su cosa si basano le espressioni lambda?

sobes.tech AI

Risposta dell'AI

Basato sul meccanismo Invoke Dynamic (JSR 292). Permette di posticipare la risoluzione delle chiamate ai metodi fino al momento dell'esecuzione. Questo rende le lambda più flessibili e performanti rispetto all'uso di classi interne anonime per interfacce funzionali semplici.

Il compilatore Java trasforma l'espressione lambda in una costruzione specifica che utilizza il metodo statico lambda$(), chiamato tramite invokedynamic.

Esempio:

// Interfaccia funzionale
interface MyFunctionalInterface {
    void myMethod();
}

// Uso della lambda
public class LambdaExample {
    public static void main(String[] args) {
        MyFunctionalInterface myLambda = () -> System.out.println("Ciao dalla lambda!");
        myLambda.myMethod();
    }
}

Dopo la compilazione, il codice con la lambda apparirà circa così (in bytecode):

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

Il metodo bootstrap (metodo di caricamento iniziale) per invokedynamic decide quale metodo chiamare. Nel caso delle lambda, di solito è java.lang.invoke.LambdaMetafactory.metafactory(), che genera la classe e l'istanza dell'interfaccia funzionale al momento dell'esecuzione, collegandola con l'implementazione della lambda (in questo caso, il metodo statico lambda$0).

Questo approccio riduce i costi di creazione di molte classi interne anonime per lambda semplici, migliorando le prestazioni e l'uso della memoria, specialmente in collezioni e stream.