2014-04-17 17 views
18

Javada lambda ifadesi kullanarak örnek oluşturmaya çalışıyorum ve resmi JDK8 kullanıyorum. Örneğim başarıyla çalıştırıldı. i derleyici bayt koduna Lambda ifade çevirmek nasıl kontrol çalışırken Ama bu benim kılan bazı confusion.Following benim örnek kod şudur: - Bu Article yılındaJava Byte'da Lambda İfadeleri Nasıl Çevirir Byte Code

public class LambdaTest { 
    public Integer lambdaBinaryOpertor(BinaryOperator<Integer> binaryOperator) { 
     return binaryOperator.apply(60, 72); 
    } 

    public static void main(String[] args) { 
     LambdaTest test = new LambdaTest(); 
     BinaryOperator<Integer> binaryOperator = (a, b) -> a*b; 
     System.out.println("Additon using Lambda BinaryOperator: "+test.lambdaBinaryOpertor(binaryOperator)); 
    } 
} 

, bunlar derleyici lambda tercüme konusunda tartışmak bayt koduna yönelik ifadeler. Bu belgeye göre, lambda ifadesi, static yöntemine dönüşür ve lambda ifadesinin bildirildiği yer, lambda static yönteminin referansına sahiptir. Aşağıdaki örnek makalede bulunmaktadır:

//Source code 
class A { 
    public void foo() { 
     List<String> list = ... 
     list.forEach(s -> { System.out.println(s); }); 
    } 
} 

//After compile above code "translate code " 
class A { 
    public void foo() { 
     List<String> list = ... 
     list.forEach([lambda for lambda$1 as Block]); 
    } 

    static void lambda$1(String s) { 
     System.out.println(s); 
    } 
} 

Örneğim düzgün çalışıyor ve bize uygun sonucu ver. Ancak, sınıf bayt kodunu denetlemek için javap komutunu çalıştırmaya çalıştığımda, bayt kodunda lambdas için statik bir yöntem yoktur. jenerik durumunda

c:\>javap LambdaTest 
Compiled from "LambdaTest.java" 
public class LambdaTest { 
public LambdaTest(); 
public java.lang.Integer lambdaBinaryOpertor(java.util.function.BinaryOperator <java.lang.Integer>); 
public static void main(java.lang.String[]); 
} 

, köprü yöntemi derleyici tarafından oluşturulur ve biz de javap komutunu kullanarak bu yöntemi kontrol edecek, ancak lambdas durumunda hiçbir static yöntem yoktur.
  1. bu makale yayımlanmasından sonra JDK 8'de lambda için kullanılan herhangi bir yeni uygulama var mı veya i yapacağım: mart 2014 fırlatma makale 2012 ve java 8 de yayınlandı oldu Yani lambda ötesinin ilgili bazı sorularınız lambda yöntemini kontrol etmek yanlış bir şey mi?
  2. Derleyici lambda ifadesiyle ne denli ilgilenir?
  3. JVM lambda çıkışını nasıl çağırır?

cevap

17

Kullanım javap ek argümanlar sınıfının hakkında tam bilgi yazdırmak için: javap -v -p -s -c sizin Örneğin

, lambda kaynak kodu olacak:

private static java.lang.Integer lambda$main$0(java.lang.Integer, java.lang.Integer); 
    descriptor: (Ljava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer; 
    flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC 
    Code: 
     stack=2, locals=2, args_size=2 
     0: aload_0  
     1: invokevirtual #17     // Method java/lang/Integer.intValue:()I 
     4: aload_1  
     5: invokevirtual #17     // Method java/lang/Integer.intValue:()I 
     8: imul   
     9: invokestatic #2     // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
     12: areturn  
     LineNumberTable: 
     line 10: 0 
     LocalVariableTable: 
     Start Length Slot Name Signature 
      0  13  0  a Ljava/lang/Integer; 
      0  13  1  b Ljava/lang/Integer; 
} 
İlgili konular