2010-07-09 5 views
11

Java 7 avrà le chiusure (finalmente), e mi chiedo come verrà utilizzato il codice esistente utilizzando le classi/interfacce del metodo singolo (come Runnable, Comparator, ecc.).In che modo le interfacce verranno sostituite/aumentate dalle chiusure in Java?

Questo codice deve essere sostituito? Sarà una conversione di qualche tipo? Verrà aggiunto un metodo aggiuntivo utilizzando la chiusura?

Qualcuno sa come funzionerà/quali sono i piani?

Ad esempio, per utilizzare il FileFilter oggi facciamo:

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

Qualcuno sa come è questo andare a lavorare su Java7?

Forse sovraccaricare il metodo File.listFiles per ricevere una chiusura?

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 leggi questo articolo – Bozho

+0

@Bozho Non è aggiornato poiché non fa riferimento alla versione corrente di la proposta, che non ha tipi di funzione. – ColinD

+0

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

risposta

8

Queste classi/interfacce sono chiamati tipi di SAM (Single metodo astratto), e la conversione di lambda ai tipi di Sam è una parte centrale della proposta di progetto lambda per JDK7. In effetti, l'iterazione più recente della proposta rimuove i tipi di funzione e solo consente lambdas come istanze di tipi SAM. Con l'ultima versione della sintassi (che è non finale), il vostro esempio può essere scritto come:

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

Con listFiles(FileFilter) invariato rispetto a quello che è ora.

Si potrebbe anche scrivere

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

Si consiglia inoltre di dare un'occhiata a questo documento State of the Lambda che è l'ultimo aggiornamento per la proposta e spiega le cose in modo più dettagliato. Nota anche che le specifiche sono tutte soggette a modifiche, sebbene sia abbastanza certo che un'espressione/blocco lambda sarà utilizzabile come un tipo SAM come ho descritto.

+0

Il '#x (y) {return z;}' è già stato inviato a JDK7, significa che sono ' stai andando ad aggiungere questi lambda in cima a ciò che è lì dentro o rimuovere completamente la cosa '#'? La conversione SAM è comunque carina, consentirà la chiusura automatica di enormi parti dell'ambiente Java. – Esko

+0

Mi piace '#int (int y) {return z;}' meglio di '{y-> z}' – OscarRyz

+0

La sintassi non è definitiva, quindi potrebbe cambiare di nuovo, anche alla cosa '#'. Ho avuto la sensazione che molte persone non gli piacessero. Una cosa bella nella nuova versione della proposta è l'inferenza di tipo per gli argomenti al lambda, cioè '{y -> z}' piuttosto che '{int y -> z}'. – ColinD

0

Il codice esistente non è interessato e non sarà necessario sostituirlo.

Problemi correlati