Groovy (File IO): найти все файлы и вернуть все файлы - Groovy - PullRequest
8 голосов
/ 29 октября 2010

Хорошо, это должно быть легко ...

Я новичок в Groovy, и я надеюсь реализовать следующую логику:

def testFiles = findAllTestFiles();

ПокаПридумайте приведенный ниже код, который успешно печатает все имена файлов.Однако вместо печати мне просто нужно поместить их в коллекцию.Конечно, я мог бы сделать это старым способом Java: просто создать экземпляр коллекции, добавить все элементы и вернуть ее.Тем не менее, это ничему меня не научит.

Так как же вы делаете это круто, "Groovy"?) в Groovy, используя как можно меньше кода, оставаясь читаемым.

Ответы [ 4 ]

12 голосов
/ 30 октября 2010

Я бы постарался избежать создания коллекции полностью. Используя замыкания, вы можете отделить логику для выбора файлов от того, что вы на самом деле хотите с ними делать, например:

import groovy.io.FileType

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

Тогда, если вы хотите что-то сделать с тестовыми файлами, вы можете сделать это напрямую, не создавая список в памяти:

withEachTestFile() { println it }

или, если вам действительно нужен список, вы можете легко сгенерировать его, используя любую коллекцию, имеющую смысл:

def files = []
withEachTestFile() { files << it }
10 голосов
/ 02 декабря 2010

Более новый, стандартный и более общий способ обхода каталога, который поддерживает множественные обратные вызовы замыкания, traverse.

import static groovy.io.FileType.FILES
...
def files = [] 
new File("src/test/java").traverse(type: FILES, nameFilter: ~/Test\.java$/) {
    files << it    
}
2 голосов
/ 03 ноября 2010

Следующее не проверено, но метод findAll должен помочь сделать ваш код очень кратким:

List<File> files = new File("src/test/java").listFiles().findAll { it.name =~ /Test\.java$/ }
2 голосов
/ 30 октября 2010

как то так должно работать

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

или я думаю изменить ваш код следующим образом

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