Σε τι βασίζονται οι εκφράσεις lambda;
sobes.tech AI
Απάντηση από AI
Βασίζεται στον μηχανισμό Invoke Dynamic (JSR 292). Επιτρέπει την αναβολή της επίλυσης των κλήσεων μεθόδων μέχρι την εκτέλεση. Αυτό καθιστά τις lambdas πιο ευέλικτες και αποδοτικές από τη χρήση ανώνυμων εσωτερικών κλάσεων για απλά λειτουργικά interfaces.
Ο μεταγλωττιστής Java μετατρέπει την έκφραση lambda σε μια συγκεκριμένη κατασκευή που χρησιμοποιεί τη στατική μέθοδο lambda$(), η οποία καλείται μέσω invokedynamic.
Παράδειγμα:
// Λειτουργικό interface
interface MyFunctionalInterface {
void myMethod();
}
// Χρήση lambda
public class LambdaExample {
public static void main(String[] args) {
MyFunctionalInterface myLambda = () -> System.out.println("Γειά από τη lambda!");
myLambda.myMethod();
}
}
Μετά τη μεταγλώττιση, ο κώδικας με lambda θα μοιάζει περίπου έτσι (σε bytecode):
invokedynamic #0:myMethod:()V()LI; // BootstrapMethod:lambda$0
astore_1
aload_1
invokeinterface MyFunctionalInterface.myMethod:()V interface 1
Η μέθοδος bootstrap (μέθοδος αρχικής φόρτωσης) για το invokedynamic αποφασίζει ποια μέθοδο θα καλέσει. Στην περίπτωση των lambdas, αυτό είναι συνήθως το java.lang.invoke.LambdaMetafactory.metafactory(), που δημιουργεί την κλάση και το στιγμιότυπο του λειτουργικού interface κατά το χρόνο εκτέλεσης, συνδέοντάς το με την υλοποίηση της lambda (σε αυτήν την περίπτωση, τη στατική μέθοδο lambda$0).
Αυτή η προσέγγιση μειώνει το κόστος δημιουργίας πολλαπλών ανώνυμων εσωτερικών κλάσεων για απλές lambdas, βελτιώνοντας την απόδοση και τη χρήση μνήμης, ειδικά σε συλλογές και streams.