19

任何人都可以描述这种代码来理解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);
        }
    }
}
4

2 回答 2

29

重要说明:问题是关于较早的提案。这不是选择的语法。将此 Q/A 视为“历史参考”。


Gilad Bracha、Neal Gafter、James Gosling 和 Peter von der Ahé在BGGA 提案中描述了这种语法。

这段代码可以描述如下:

  1. 它将一个函数作为第二个参数(T, T)并返回Number(并将其分配给 parameter block

  2. 然后它创造了Comparator<T>它。这是通过将compare方法委托给调用来实现的block

  3. 将此比较器传递给Collections.sort方法。


下面是语法的分解:

public static <T> void sort(List<T> l, final {T, T=>Number} block) {
                                             ^^^^^^^^^^^^^^^^^^^^

一个名为“函数,需要两个并返回一个block类型的参数。TNumber

    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);
            }
        });
    }
}
于 2011-05-26T10:28:54.843 回答
4

正如@axtavt 指出的那样,Java 7(不幸的是)不会有闭包。然而,Groovy 确实在 JVM 上运行,并且与其他 Java 代码很好地集成。我会阅读此内容以获取更多信息。

于 2011-05-26T10:28:42.307 回答