Nota importante: La pregunta estaba relacionada con una propuesta anterior . Esta no fue la sintaxis elegida. Vea esta Q/A como una "referencia histórica".
Esta sintaxis se describe en el BGGA-proposal por Gilad Bracha, Neal Gafter, James Gosling, y Peter von der Ahe.
este fragmento de código puede ser descrito como sigue:
Se toma como el segundo argumento de una función de tomar parámetros (T, T)
y volviendo Number
(y lo asigna al parámetro block
)
A continuación, crea un Comparator<T>
fuera de él. Esto lo hace implementando el método compare
delegándolo en una llamada al block
.
Pasa este comparador al método Collections.sort
.
Aquí viene un desglose de la sintaxis:
public static <T> void sort(List<T> l, final {T, T=>Number} block) {
^^^^^^^^^^^^^^^^^^^^
Un argumento llamado block
que es de "función que toma dos T
y devuelve un Number
" tipo .
Collections.sort(l, new Comparator<T>() {
public int compare(T arg0, T arg1) {
...
}
}
}
una llamada ordinaria de Collections.sort
con una instancia de una subclase anónima de Comparator
como segundo argumento ...
...
return block.invoke(arg0, arg1);
...
... que devuelve el número calculado por la función definida por el argumento block
.
Dicho en términos de Java clásica, el fragmento correspondería a algo así como
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);
}
});
}
}
Java 7 no tiene cierres. El soporte para cierres se ha pospuesto a Java 8. – axtavt
Técnicamente, las clases internas son cierres (definen funciones con acceso a identificadores de un alcance adjunto). Lo que Java 7 no tiene son * cierres * elegantes. –