2010-10-29 4 views
8

Ok, das sollte einfach sein ...Groovy (File IO): alle Dateien finden und alle Dateien zurückgeben - der Groovy Weg

Ich bin neu in groovy und ich bin auf der Suche nach der folgenden Logik zu implementieren:

def testFiles = findAllTestFiles(); 

Bisher bin ich mit dem unten stehenden Code gekommen, der alle Dateinamen erfolgreich druckt. Anstatt jedoch zu drucken, muss ich sie nur in eine Sammlung legen. Natürlich könnte ich dies auf die alte Java-Art tun: einfach eine Sammlung instantiieren, alle Elemente hinzufügen und sie zurückgeben. Aber das würde mir nichts lehren.

Also wie machst du das cool, "Groovy" Weg?

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; 
} 

Ich suche findAlltestFiles() in Groovy mit so wenig Code wie möglich zu implementieren, während noch lesbar sein.

Antwort

12

Ich würde versuchen, ganz den Aufbau der Sammlung zu vermeiden. Mit Verschlüsse können Sie die Logik trennen die Dateien von zu wählen, was Sie wollen tatsächlich mit ihnen zu tun, etwa so:

import groovy.io.FileType 

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

Dann, wenn Sie etwas auf den Testdateien tun möchten, können Sie es direkt tun, ohne Aufbau einer Liste im Speicher:

withEachTestFile() { println it } 

oder wenn Sie wirklich die Liste möchten, können Sie es leicht erzeugen, mit was auch immer Sammlung macht Sinn:

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

Ich fühle, dass ich wirklich die Liste der Dateien brauche, aber ich bin wahrscheinlich falsch (da dies meine erste Groovy-Klasse ist). Ich werde Ihren ersten Vorschlag genauer betrachten - es scheint eine ** großartige ** Einsicht zu sein. Ich muss damit spielen, um zu verstehen, was du sagst und wie du es anwenden kannst - das ist eine ganz andere Art, über Dinge nachzudenken! Ich mag es ... groovy wächst auf mich, schnell. – gMale

+0

Ich habe mein gesamtes Skript neu geschrieben und versuche, mit * closures * zu denken. Manchmal schmerzt es mich immer noch ein wenig, tief darüber nachzudenken. Aber ich bin auf Groovy verkauft, also werde ich ein paar Bücher bekommen und anfangen, diesen neuen Ansatz zu meistern. Ich bin gespannt auf die Verwendung der Groovy Console ... danke für deine Hilfe. – gMale

2

so etwas wie dies sollte

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

arbeiten oder ich denke, Modifizieren Sie den Code wie dieser

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

danke! Ihre Antwort war auf den Punkt und sehr hilfreich. Ich wünschte, ich könnte dir auch Punkte für die richtige Antwort geben! Danke, dass Sie sich die Zeit genommen haben, um zu helfen. – gMale

2

Das folgende ist nicht getestet, b ut sollte die findAll Methode helfen, Ihren Code sehr prägnant machen:

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

Eine neuere, Standard- und generische Art und Weise, ein Verzeichnis zu durchqueren, die mehrere Verschlüsse Rückrufe unterstützt ist traverse.

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