问题描述
|
谁能描述这种代码来理解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);
}
}
}
解决方法
重要说明:问题是关于较早的提案。这不是选择的语法。请参阅此Q / A作为“历史参考”。
Gilad Bracha,Neal Gafter,James Gosling和Peter von derAhé在BGGA建议中描述了此语法。
此代码段可以描述如下:
它以第二个参数为参数ѭ1return并返回
Number
的函数(并将其分配给参数ѭ3to)。
然后从中创建一个“ 4”。这是通过将to5ѭ方法委派给ѭ3call调用来实现的。
将此比较器传递给“ 7”方法。
语法分解如下:
public static <T> void sort(List<T> l,final {T,T=>Number} block) {
^^^^^^^^^^^^^^^^^^^^
一个名为ѭ3of的参数,其类型为\“ function,它取两个T
并返回Number
\”。
Collections.sort(l,new Comparator<T>() {
public int compare(T arg0,T arg1) {
...
}
}
}
用Comparator
匿名子类的实例作为第二个参数对to7ѭ的普通调用...
...
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);
}
});
}
}
,正如@axtavt指出的那样,(不幸的)Java 7不会关闭。但是,Groovy确实可以在JVM上运行,并且可以与其他Java代码很好地集成。我将阅读此书以获取更多信息。