2015-07-15 20 views
11

Aşağıdaki kodu:Bir lambda çağrısı için neden 2 adet istif çerçevesi var?

public static void main(String[] args) { 
    Collections.singleton(1).stream().forEach(i -> new Exception().printStackTrace()); 
} 

baskılar:

java.lang.Exception 
    at PrintLambdaStackTrace.lambda$main$0(PrintLambdaStackTrace.java:6) 
    at PrintLambdaStackTrace$$Lambda$1/1831932724.accept(Unknown Source) 
    at java.util.Collections$2.tryAdvance(Collections.java:4717) 
    at java.util.Collections$2.forEachRemaining(Collections.java:4725) 
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580) 
    at PrintLambdaStackTrace.main(PrintLambdaStackTrace.java:6) 

Nasıl lamda çağırma

uygulandığı ? Neden 2 yığın çerçevesi var?

+0

Bu güzel bir soru. Cevabım kendimle ilgilendiğimden beri izleyeceğim. Tahminim, JVM'nin yürütme süresinde anonim bir sınıf oluşturmasıdır. Bir yığın, sınıfı oluşturmak için kullanılan yöntemden ve sınıfın kendisinden ikinci olandan kaynaklanır. Ama bu sadece bir tahmin. – Sekkuar

+1

Ayrıca bkz. Http://stackoverflow.com/q/16827262/2711488 – Holger

cevap

7
PrintLambdaStackTrace$$Lambda$1/1831932724.accept(Unknown Source) 

Bu, gerekli arabirimi uygulayan oluşturulmuş bir sınıftır. Onun accept yöntemi, derleme zamanında oluşturulan ve PrintLambdaStackTrace sınıfına eklenen bir yönteme delege eden bir saplamadır. Bu sınıf lambda bağlantı süresiyle üretilir (ilk kez bir lambda örneğinin oluşturulması gerekir).

PrintLambdaStackTrace.lambda$main$0(PrintLambdaStackTrace.java:6) 

Bu lambda'nın davranışını gerçekte uygulayan yöntemdir. Bu PrintLambdaStackTrace sınıfına aittir.

+1

Ben buna * iç * sınıfı derim. Bu sadece oluşturulmuş bir sınıf. – Holger

+0

Anladım. Ve lambda'nın anonim bir sınıfa dönüştürülmesine kıyasla bu yaklaşımın yararı nedir? –

+2

@Bogdan Calmac: uygulama yöntemi, lambda ifadesini tanımlayan sınıfta yer alır, dolayısıyla doğal olarak tüm çevreye erişimi vardır. Ayrıca, diskinizde/kavanoz dosyasında herhangi bir sınıf dosyası yok… – Holger

İlgili konular