重要注意事項:問題是關於較早的建議。這不是選擇的語法。將此Q/A視爲「歷史參考」。
這句法在BGGA-proposal由吉拉德·布拉徹,尼爾Gafter,詹姆斯·高斯林,和彼得·馮·德AHE描述。
該代碼段可以被描述爲如下:
它需要作爲第二個參數的函數取參數(T, T)
和返回Number
(並給它分配給參數block
)
然後,它從中創建一個Comparator<T>
。這是通過將compare
方法委託給block
進行調用來實現的。
將此比較器傳遞給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);
}
});
}
}
Java 7中沒有閉包。對閉包的支持已推遲到Java 8。 – axtavt 2011-05-26 10:24:00
從技術上講,內部類是閉包(它們定義可訪問包含範圍的標識符的函數)。 Java 7沒有的優雅封閉。 – 2014-05-10 09:24:50