Java封闭介绍

时间:2011-05-26 10:22:20

标签: java java-8

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

2 个答案:

答案 0 :(得分:30)

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


Gilad Bracha,Neal Gafter,James Gosling和Peter vonderAhé在BGGA-proposal中描述了这种语法。

这段代码可以描述如下:

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

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

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


  4. 以下是语法分解:

    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了解更多信息。