2011-05-26 20 views
19

¿Puede alguien describir este tipo de código para comprender el cierre de Java?Java closure introduction

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); 
     } 
    } 
} 
+19

Java 7 no tiene cierres. El soporte para cierres se ha pospuesto a Java 8. – axtavt

+1

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. –

Respuesta

30

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:

  1. 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)

  2. 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.

  3. 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); 
      } 
     }); 
    } 
} 
+2

¡heno! Su muy buena derivación –

+1

No puedo esperar para tener eso en Java. Cansado de dozes of fire ... Métodos de Event() en mis observables. –

+1

Para una buena explicación del último estado de las lambdas, eche un vistazo a http://cr.openjdk.java.net/~ briangoetz/lambda/collections-overview.html – Bringer128

4

Como @axtavt señala, Java 7 (lamentablemente) no va a tener cierres. Sin embargo, Groovy sí, se ejecuta en la JVM y se integra muy bien con otros códigos Java. Me gustaría read esto para obtener más información.

Cuestiones relacionadas