Sobes.tech
Middle

Lambda ifadeleri neye dayanır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Invoke Dynamic (JSR 292) mekanizmasına dayalıdır. Çağrıların çözümlemesini çalışma zamanına ertelemeye olanak tanır. Bu, basit fonksiyonel arayüzler için anonim iç sınıflar kullanmaktan daha esnek ve verimli lambda ifadeleri yapar.

Java derleyicisi, lambda ifadesini lambda$() adlı statik yöntemi kullanan özel bir yapıya dönüştürür ve bu, invokedynamic aracılığıyla çağrılır.

Örnek:

// Fonksiyonel arayüz
interface MyFunctionalInterface {
    void myMethod();
}

// Lambda kullanımı
public class LambdaExample {
    public static void main(String[] args) {
        MyFunctionalInterface myLambda = () -> System.out.println("Lambdadan Merhaba!");
        myLambda.myMethod();
    }
}

Derlemeden sonra, lambda içeren kod yaklaşık olarak şu görünecektir (bytecode):

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

invokedynamic için bootstrap yöntemi (başlangıç yöntemi), hangi yöntemin çağrılacağını belirler. Lambda durumunda, genellikle java.lang.invoke.LambdaMetafactory.metafactory() kullanılır, bu çalışma zamanında fonksiyonel arayüzün sınıfını ve örneğini oluşturur ve onu lambda uygulamasıyla bağlar (bu durumda, statik yöntem lambda$0).

Bu yaklaşım, basit lambdalar için çok sayıda anonim iç sınıf oluşturma maliyetini azaltır, performansı ve bellek kullanımını artırır, özellikle koleksiyonlar ve akışlar (streams) üzerinde.