开发者

Groovy (File IO): find all files and return all files - the Groovy way

Ok, this should be easy...

I'm new to groovy and I'm looking to implement the following logic:

def testFiles = findAllTestFiles();

So far, I've come up with the code below which successfully prints all files names. However, instead of printing, I just need to put them into a collection. Of course, I could do this the old java way: just instantiate a collection, add all the elements and return it. However, that wouldn't teach me anything.

So how do you do this the cool, "Groovy" way?

static File[] findAllTestFiles() {
    def directory = new File("src/test/java");
    def closure = {File f -> if(f.na开发者_运维知识库me =~ /Test\.java$/) println f }
    directory.eachFileRecurse FileType.FILES, closure
    return null;
}

I'm looking to implement findAlltestFiles() in Groovy using as little code as possible while still being readable.


I'd try to avoid building the collection entirely. Using closures, you can separate the logic to select the files from what you actually want to do with them, like 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)
        }
    }
}

Then if you want to do something on the test files, you can do it directly without building up a list in memory:

withEachTestFile() { println it }

or if you really want the list, you can easily generate it, using whatever collection makes sense:

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


A newer, standard and more generic way to traverse a directory which supports multiple closure callbacks is traverse.

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


something like this should work

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

or i think modifying your code like this

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


The following is untested, but the findAll method should help make your code very concise:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜