Sobes.tech
Middle

Ифодаҳои ламбда ба чӣ асос ёфтаанд?

sobes.tech AI

Ҷавоб аз AI

Базирано на механизми Invoke Dynamic (JSR 292). Той позволява отлагане на разрешаването на извикванията на методи до момента на изпълнение. Това прави ламбда изразите по-гъвкави и по-ефективни от използването на анонимни вътрешни класове за прости функционални интерфейси.

Java компилаторът преобразува ламбда израза в специфична конструкция, която използва статичния метод lambda$(), извикван чрез invokedynamic.

Пример:

// Функционален интерфейс
interface MyFunctionalInterface {
    void myMethod();
}

// Използване на ламбда
public class LambdaExample {
    public static void main(String[] args) {
        MyFunctionalInterface myLambda = () -> System.out.println("Здравей от ламбдата!");
        myLambda.myMethod();
    }
}

След компилация, кодът с ламбда ще изглежда приблизително така (в байткод):

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

Bootstrap методът (методът за начално зареждане) за invokedynamic решава кой метод да бъде извикан. В случай на ламбда, това обикновено е java.lang.invoke.LambdaMetafactory.metafactory(), който генерира класа и екземпляра на функционалния интерфейс по време на изпълнение, свързвайки го с реализацията на ламбдата (в този случай, статичния метод lambda$0).

Този подход намалява разходите за създаване на множество анонимни вътрешни класове за прости ламбда изрази, подобрявайки производителността и използването на паметта, особено в колекции и стриймове.