2011-05-26 159 views
19

任何人都可以描述這種類型的代碼來理解Java關閉。Java關閉介紹

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

Java 7中沒有閉包。對閉包的支持已推遲到Java 8。 – axtavt 2011-05-26 10:24:00

+1

從技術上講,內部類是閉包(它們定義可訪問包含範圍的標識符的函數)。 Java 7沒有的優雅封閉。 – 2014-05-10 09:24:50

回答

30

重要注意事項:問題是關於較早的建議。這不是選擇的語法。將此Q/A視爲「歷史參考」。


這句法在BGGA-proposal由吉拉德·布拉徹,尼爾Gafter,詹姆斯·高斯林,和彼得·馮·德AHE描述。

該代碼段可以被描述爲如下:

  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) { 
      ... 
     } 
    } 
} 

Collections.sort的普通呼叫用的Comparator作爲第二個參數的匿名子類的實例...

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

...返回由block參數定義的函數計算出的數。


放在經典的Java而言,你的代碼段將對應於像

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

乾草!它真的很好的衍生 – 2011-05-26 13:23:35

+1

不能等待在Java中有。厭倦了火災的打瞌睡......我觀察到的事件()方法。 – 2012-04-23 16:26:54

+1

想要了解lambda的最新狀態,請查看http://cr.openjdk.java。淨/〜briangoetz /λ/收藏-overview.html – Bringer128 2012-04-24 09:45:40

4

正如@axtavt指出的那樣,Java 7(不幸的是)不會關閉。但是,Groovy的確在JVM上運行,並且與其他Java代碼很好地集成在一起。我想read這是更多信息。