2011-05-26 14 views
19

कोई भी जावा बंद करने के लिए इस तरह के कोड का वर्णन कर सकता है।जावा क्लोजर परिचय

public static <T> void sort(List<T> l, final {T, T=>Number} block) { 

    Collections.sort(l, new Comparator<T>() { 
     public int compare(T arg0, T arg1) { 
      return block.invoke(arg0, arg1); 
     } 
    } 
} 
+19

जावा 7 की तरह कुछ के अनुरूप बंद नहीं है जाएगा। बंद करने के लिए समर्थन जावा 8 को स्थगित कर दिया गया है। – axtavt

+1

तकनीकी रूप से आंतरिक कक्षाएं बंद हैं (वे एक संलग्न क्षेत्र के पहचानकर्ताओं तक पहुंच के साथ कार्यों को परिभाषित करते हैं)। जावा 7 के पास * सुरुचिपूर्ण * बंद नहीं है। –

उत्तर

30

महत्वपूर्ण नोट: प्रश्न प्रस्ताव के संबंध में था। यह वाक्यविन्यास नहीं चुना गया था। इस क्यू/ए को "ऐतिहासिक संदर्भ" के रूप में देखें।


इस वाक्य रचना गिलाड ब्राचा, नील Gafter, जेम्स गोसलिंग, और पीटर वॉन डेर Ahe से BGGA-proposal में वर्णित है।

कोड के इस स्निपेट इस प्रकार कहा जा सकता है:

  1. यह दूसरा तर्क के रूप में एक समारोह मापदंडों (T, T) लेने और Number लौटने लेता है (और यह प्रदान करती है block पैरामीटर के लिए)

  2. यह तो इसमें से Comparator<T> बनाता है। यह compare विधि को block पर कॉल करने के लिए इसे प्रतिनिधि द्वारा कार्यान्वित करके करता है।

  3. इस तुलनित्र को Collections.sort विधि पर पास करता है।


यहाँ वाक्य रचना के नीचे एक ब्रेक आता है:

public static <T> void sort(List<T> l, final {T, T=>Number} block) { 
              ^^^^^^^^^^^^^^^^^^^^ 

एक तर्क block प्रकार "समारोह है कि दो T लेता है और एक Number रिटर्न" की है जो कहा जाता है।

Collections.sort(l, new Comparator<T>() { 
     public int compare(T arg0, T arg1) { 
      ... 
     } 
    } 
} 

Comparator दूसरा तर्क के रूप में की एक अनाम उपवर्ग का एक उदाहरण के साथ Collections.sort लिए एक साधारण कॉल ...

 ... 
      return block.invoke(arg0, arg1); 
     ... 

... जो संख्या समारोह block तर्क द्वारा परिभाषित द्वारा गणना रिटर्न ।

शास्त्रीय जावा के मामले में

रखें, अपने टुकड़ा

interface Block<T> { 
    public int invoke(T arg1, T arg2); 
} 


class Test { 
    public static <T> void sort(List<T> l, final Block<T> block) { 
     Collections.sort(l, new Comparator<T>() { 
      public int compare(T arg0, T arg1) { 
       return block.invoke(arg0, arg1); 
      } 
     }); 
    } 
} 
+2

घास! इसका वास्तव में अच्छा व्युत्पन्न –

+1

जावा में ऐसा करने की प्रतीक्षा करें। आग के दर्जनों से थक गए ... मेरे अवलोकनों में घटना() विधियां। –

+1

लैम्बडास की नवीनतम स्थिति की अच्छी व्याख्या के लिए, http://cr.openjdk.java पर एक नज़र डालें।शुद्ध/~ briangoetz/लैम्ब्डा/संग्रह-overview.html – Bringer128

4

जैसा कि @axtavt बताता है, जावा 7 (दुर्भाग्य से) बंद होने वाला नहीं है। हालांकि, ग्रोवी करता है, जेवीएम पर चलता है, और अन्य जावा कोड के साथ बहुत अच्छी तरह से एकीकृत करता है। अधिक जानकारी के लिए मैं read चाहता हूं।