Введение в Java - PullRequest
19 голосов
/ 26 мая 2011

Может ли кто-нибудь описать такой код, чтобы понять закрытие 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 ]

30 голосов
/ 26 мая 2011

Важное примечание: Вопрос касался более раннего предложения .Это не был выбран синтаксис.См. Этот Q / A как «исторический справочник».


Этот синтаксис описан в 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) {
                                             ^^^^^^^^^^^^^^^^^^^^

Аргумент с именем 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);
            }
        });
    }
}
4 голосов
/ 26 мая 2011

Как указывает @axtavt, Java 7 (к сожалению) не будет иметь замыканий.Однако Groovy делает, работает на JVM и очень хорошо интегрируется с другим кодом Java.Я бы прочитал это для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...