Groovy (File IO): найдите все файлы и верните все файлы-Groovy way

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

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

def testFiles = findAllTestFiles();

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

Итак, как вы это делаете это крутой, "Заводной" способ?

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

Я ищу, чтобы реализовать findAlltestFiles() в Groovy, используя как можно меньше кода, пока он все еще читается.

4 ответов


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

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 }

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

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

что-то вроде этого должно работать

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

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

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