Важное примечание: Вопрос касался более раннего предложения .Это не был выбран синтаксис.См. Этот Q / A как «исторический справочник».
Этот синтаксис описан в BGGA-предложении Гилада Брача, Нила Гафтера, Джеймса Гослинга и Питера фон дерАхе.
Этот фрагмент кода можно описать следующим образом:
Он принимает в качестве второго аргумента функцию, принимающую параметры (T, T)
и возвращающую Number
(иприсваивает его параметру block
)
Затем из него создается Comparator<T>
.Это достигается путем реализации метода compare
путем делегирования его вызова block
.
Передает этот компаратор методу 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);
}
});
}
}