Uz ko balstās lamdas izteiksmes?
sobes.tech AI
Atbilde no AI
Balstīts uz Invoke Dynamic (JSR 292) mehānismu. Tas ļauj atlikt meto izsaukumu risināšanu līdz izpildes brīdim. Tas padara lambda izteiksmes elastīgākas un efektīvākas nekā vienkāršu funkcionālo interfeisu anonimās iekšējās klases.
Java kompilators pārvērš lambda izteiksmi par specifisku konstrukciju, kas izmanto statisko metodi lambda$(), kas tiek izsaukta caur invokedynamic.
Piemērs:
// Funkcionālais interfeiss
interface MyFunctionalInterface {
void myMethod();
}
// Lambda izmantošana
public class LambdaExample {
public static void main(String[] args) {
MyFunctionalInterface myLambda = () -> System.out.println("Sveiki no lambda!");
myLambda.myMethod();
}
}
Pēc kompilēšanas kods ar lambda izteiksmi izskatīsies aptuveni šādi (bytecode):
invokedynamic #0:myMethod:()V()LI; // BootstrapMethod:lambda$0
astore_1
aload_1
invokeinterface MyFunctionalInterface.myMethod:()V interface 1
Bootstrap metode (sākotnējās ielādes metode) nosaka, kuru metodi izsaukt. Lambda gadījumā tas parasti ir java.lang.invoke.LambdaMetafactory.metafactory(), kas ģenerē klasi un funkciju interfeisa instanci izpildes laikā, sasaistot to ar lambda realizāciju (šajā gadījumā, statisko metodi lambda$0).
Šī pieeja samazina izmaksas, radot vairākas anonīmas iekšējās klases vienkāršām lambda izteiksmēm, uzlabo veiktspēju un atmiņas izmantošanu, īpaši kolekcijās un straumēs.