2010-10-29 5 views
8

Ok, cela devrait être facile ...Groovy (Fichier IO): trouver tous les fichiers et retourner tous les fichiers - la manière Groovy

Je suis nouveau groovy et je cherche à mettre en œuvre la logique suivante: Jusqu'ici, j'ai trouvé le code ci-dessous qui imprime avec succès tous les noms de fichiers. Cependant, au lieu d'imprimer, j'ai juste besoin de les mettre dans une collection. Bien sûr, je pourrais faire cela de la manière java: instancier une collection, ajouter tous les éléments et la renvoyer. Cependant, cela ne m'apprendrait rien.

Alors, comment faites-vous cette façon cool, "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; 
} 

Je cherche à mettre en œuvre findAlltestFiles() en Groovy utilisant comme peu de code que possible tout en étant lisible.

Répondre

12

Je vais essayer d'éviter de construire entièrement la collection. En utilisant les fermetures, vous pouvez séparer la logique pour sélectionner les fichiers à partir de ce que vous voulez vraiment faire avec eux, comme ceci:

import groovy.io.FileType 

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

Ensuite, si vous voulez faire quelque chose sur les fichiers de test, vous pouvez le faire directement, sans la construction d'une liste en mémoire:

withEachTestFile() { println it } 

ou si vous voulez vraiment la liste, vous pouvez facilement générer, en utilisant tous les sens collection:

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

Je pense que j'ai vraiment besoin de la liste des fichiers mais je me trompe probablement (puisque c'est ma première classe Groovy, jamais). Je vais considérer votre première suggestion de manière plus approfondie - cela semble être un bon aperçu. Je vais devoir jouer avec pour bien comprendre ce que vous dites et comment l'appliquer - c'est une façon complètement différente de penser aux choses! J'aime ça ... groovy grandit sur moi, vite. – gMale

+0

J'ai réécrit tout mon script, en essayant de concevoir avec des * fermetures * à l'esprit. Parfois, ça me fait encore un peu mal à la tête d'y penser, profondément. Mais je suis vendu sur Groovy donc je vais prendre quelques livres et commencer à maîtriser cette nouvelle approche. Je suis ravi d'apprendre à utiliser Groovy Console ... merci pour votre aide. – gMale

2

quelque chose comme cela devrait fonctionner

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

ou je pense que la modification du code comme celui-ci

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

merci! Votre réponse était pertinente et très utile. J'aimerais pouvoir vous attribuer des points pour la bonne réponse! Merci d'avoir pris le temps d'aider. – gMale

2

ce qui suit est non testé, b ut la méthode findAll devrait aider à rendre votre code très concise:

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

Une nouvelle, de manière standard et plus générique pour parcourir un répertoire qui prend en charge les fonctions de rappel de fermeture multiples est traverse.

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