2010-07-09 7 views
11

Java 7 tendrá cierres (finalmente), y me pregunto cómo se usará ahora el código existente que usa clases/interfaces de métodos únicos (como Runnable, Comparator, etc.).¿Cómo van a ser reemplazadas/aumentadas las interfaces por los cierres en Java?

¿Se debería reemplazar ese código? ¿Será una conversión de algún tipo? ¿Se agregará un método adicional usando el cierre?

¿Alguien sabe cómo va a funcionar esto/cuáles son los planes?

Por ejemplo, para utilizar el FileFilter hoy hacemos:

.... 
File [] files = directory.listFiles(new FileFilter() 
         public boolean accept(File file) { 
          return file.getName().endsWith(".java"); 
         } 
        }); 

¿Alguien sabe cómo se va a trabajar en Java7?

¿Quizás sobrecargar el método File.listFiles para recibir un cierre?

File [] files = directory.listFiles(#(File file){ 
        return file.getName().endsWith(".java"); 
       }); 
+0

http://stronglytypedblog.blogspot.com/2010/07/lambdas-in-java-preview-part-2.html vea este artículo – Bozho

+0

@Bozho Eso está desactualizado ya que no hace referencia a la versión actual de la propuesta, que no tiene tipos de funciones. – ColinD

+0

http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-3.html – OscarRyz

Respuesta

8

Estas clases/interfaces se llaman tipos de SAM (Individual Resumen Método), y la conversión de lambdas a tipos SAM es una parte central de la propuesta de proyecto para lambda JDK7. De hecho, la iteración más reciente de la propuesta elimina los tipos de funciones y solo permite a lambdas como instancias de tipos de SAM. Con la última versión de la sintaxis (que es no final), su ejemplo se podría escribir como:

File[] files = directory.listFiles(#(file){file.getName().endsWith(".java")}); 

con listFiles(FileFilter) sin cambios de lo que es ahora.

También podría escribir

FileFilter javaFileFilter = {#(file){file.getName().endsWith(".java")}; 

También es posible que desee echar un vistazo a este documento State of the Lambda que es la última actualización de la propuesta y explica las cosas con más detalle. Tenga en cuenta también que las especificaciones están sujetas a cambios, aunque es bastante cierto que una expresión/bloque lambda se podrá utilizar como un tipo de SAM como he descrito.

+0

El '#x (y) {return z;}' ya está insertado en JDK7, ¿significa esto? ¿Vas a agregar estas lambdas encima de lo que hay actualmente o eliminar la cosa '#' por completo? Sin embargo, la conversión SAM es agradable, permitirá que grandes partes del entorno Java se cierren automáticamente. – Esko

+0

Me gusta '#int (int y) {return z;}' mejor que '{y-> z}' – OscarRyz

+0

La sintaxis no es definitiva, por lo que podría cambiar nuevamente, incluso volver a la cosa '#'. Me dio la sensación de que a mucha gente no le gustó eso. Una cosa agradable en la nueva versión de la propuesta es la inferencia de tipo para los argumentos a la lambda, es decir, '{y -> z}' en lugar de '{int y -> z}'. – ColinD

0

El código existente no se ve afectado y no será necesario reemplazarlo.

Cuestiones relacionadas