Java封闭介绍

Sub*_*der 19 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

aio*_*obe 30

重要提示:问题是关于早先的提案.这不是选择的语法.将此Q/A视为"历史参考".


这种语法在Gilad Bracha,Neal Gafter,James Gosling和Peter vonderAhé 的BGGA提案中有所描述.

这段代码可以描述如下:

  1. 它接受一个函数获取参数(T, T)并返回Number(并将其赋值给参数block)作为第二个参数

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

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


这是一个细分语法:

public static <T> void sort(List<T> l, final {T, T=>Number} block) {
                                             ^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

称为自变量block是类型的"功能,需要两个T并返回一个Number".

    Collections.sort(l, new Comparator<T>() {
        public int compare(T arg0, T arg1) {
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Collections.sort使用匿名子类的实例Comparator作为第二个参数的普通调用...

        ...
            return block.invoke(arg0, arg1);
        ...
Run Code Online (Sandbox Code Playgroud)

...返回由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);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)