任何人都可以描述这种代码来理解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);
}
}
}
答案 0 :(得分:30)
重要说明:问题是关于早期的提案。这不是选择的语法。将此Q / A视为“历史参考”。
Gilad Bracha,Neal Gafter,James Gosling和Peter vonderAhé在BGGA-proposal中描述了这种语法。
这段代码可以描述如下:
第二个参数是一个函数,它接受参数(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);
}
});
}
}
答案 1 :(得分:4)
正如@axtavt指出的那样,Java 7(不幸的是)不会有闭包。但是,Groovy可以在JVM上运行,并且可以很好地与其他Java代码集成。我read了解更多信息。