重要注意事项:问题是关于较早的建议。这不是选择的语法。将此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