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$/ }