2010-10-29 29 views
8

Ok, questo dovrebbe essere facile ...Groovy (File IO): trovare tutti i file e restituire tutti i file - il modo Groovy

Sono nuovo di Groovy e sto cercando di implementare la seguente logica:

def testFiles = findAllTestFiles(); 

Finora, ho creato il seguente codice che stampa correttamente tutti i nomi di file. Tuttavia, invece di stampare, ho solo bisogno di metterli in una collezione. Certo, potrei fare questo con il vecchio modo java: basta istanziare una raccolta, aggiungere tutti gli elementi e restituirla. Tuttavia, questo non mi insegnerebbe nulla.

Quindi, come si fa a fare questo in modo fantastico, "Groovy"?

static File[] findAllTestFiles() { 
    def directory = new File("src/test/java"); 
    def closure = {File f -> if(f.name =~ /Test\.java$/) println f } 
    directory.eachFileRecurse FileType.FILES, closure 
    return null; 
} 

Sto cercando di implementare findAlltestFiles() in Groovy con il meno codice possibile, pur essendo leggibile.

risposta

12

mi piacerebbe provare a evitare di costruire la collezione interamente. Utilizzando le chiusure, è possibile separare la logica per selezionare i file da quello che si vuole realmente fare con loro, in questo modo:

import groovy.io.FileType 

def withEachTestFile(Closure closure) { 
    new File("src/test/java").eachFileRecurse(FileType.FILES) { 
     if (it.name =~ /Test\.java$/) { 
      closure.call(it) 
     } 
    } 
} 

Poi, se si vuole fare qualcosa sui file di test, è possibile farlo direttamente senza la costruzione di una lista in memoria:

withEachTestFile() { println it } 

o se si vuole veramente la lista, si può facilmente generare, utilizzando qualunque collezione ha un senso:

def files = [] 
withEachTestFile() { files << it } 
+0

Sento che ho davvero bisogno dell'elenco dei file, ma probabilmente ho torto (dato che questa è la mia prima classe Groovy, mai). Prenderò in considerazione il tuo primo suggerimento in modo più approfondito - sembra una ** grande ** intuizione. Dovrò giocarci per capire appieno cosa stai dicendo e come applicarlo - questo è un modo completamente diverso di pensare alle cose! Mi piace ... Groovy sta crescendo su di me, veloce. – gMale

+0

Ho riscritto il mio intero script, cercando di progettare con * chiusure * in mente. A volte, mi fa ancora un po 'male la testa per pensarci, profondamente. Ma sono venduto su Groovy quindi prenderò alcuni libri e comincerò a padroneggiare questo nuovo approccio. Sono entusiasta di sapere come usare Groovy Console ... grazie per il tuo aiuto. – gMale

2

qualcosa come questo dovrebbe funzionare

def files = [] 
new File("src/test/java").eachFileRecurse(FILES) { 
    if(it.name =~ /Test\.java$/)) { 
     println f 
     files << f 
    } 
} 

o penso modificare il codice come questo

static File[] findAllTestFiles() { 
    def files = [] 
    def directory = new File("src/test/java"); 
    def closure = {File f -> if(f.name =~ /Test\.java$/) {println f; files << f} } 
    directory.eachFileRecurse FileType.FILES, closure 
    return files; 
} 
+0

grazie! la tua risposta è stata al punto e molto utile. Vorrei poterti assegnare punti per la risposta corretta! Grazie per aver dedicato del tempo per aiutare. – gMale

2

Quello che segue è testato, b ut il metodo findAll dovrebbe contribuire a rendere il codice molto conciso:

List<File> files = new File("src/test/java").listFiles().findAll { it.name =~ /Test\.java$/ } 
10

Un modo nuovo, di serie e più generico per attraversare una directory che supporta più callback di chiusura è traverse.

import static groovy.io.FileType.FILES 
... 
def files = [] 
new File("src/test/java").traverse(type: FILES, nameFilter: ~/Test\.java$/) { 
    files << it  
} 
Problemi correlati