【问题标题】:Groovy (File IO): find all files and return all files - the Groovy wayGroovy(文件 IO):查找所有文件并返回所有文件 - Groovy 方式
【发布时间】:2011-05-02 14:30:37
【问题描述】:

好的,这应该很容易......

我是 groovy 的新手,我希望实现以下逻辑:

def testFiles = findAllTestFiles();

到目前为止,我已经想出了下面的代码,它成功地打印了所有文件名。但是,我只需要将它们放入集合中,而不是打印。当然,我可以用旧的 java 方法来做到这一点:只需实例化一个集合,添加所有元素并返回它。但是,这不会教给我任何东西。

那么,您如何以酷炫的“Groovy”方式做到这一点?

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

我希望在 Groovy 中使用尽可能少的代码实现 findAlltestFiles(),同时仍然可读。

【问题讨论】:

    标签: file file-io groovy


    【解决方案1】:

    我会尽量避免完全构建集合。使用闭包,您可以将选择文件的逻辑与您实际想要对它们执行的操作分开,如下所示:

    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 }
    

    【讨论】:

    • 我觉得我真的需要文件列表,但我可能错了(因为这是我的第一个 Groovy 课程)。我会更彻底地考虑您的第一个建议——这似乎是一个伟大的见解。我将不得不使用它来完全理解你在说什么以及如何应用它——这是一种完全不同的思维方式!我喜欢它...... groovy 在我身上成长,速度很快。
    • 我重写了我的整个脚本,尝试在设计时考虑到闭包。有时,深深地思考它仍然让我有点头疼。但是我在 Groovy 上很受欢迎,所以我会买几本书并开始掌握这种新方法。我很高兴学习如何使用 Groovy 控制台...感谢您的帮助。
    【解决方案2】:

    一种更新、标准和更通用的遍历目录的方法是traverse。

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

    【讨论】:

      【解决方案3】:

      这样的东西应该可以工作

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

      【讨论】:

      • 谢谢!你的回答很中肯,很有帮助。我希望我也可以奖励您正确答案的积分!感谢您抽出宝贵时间提供帮助。
      【解决方案4】:

      以下内容未经测试,但 findAll 方法应该有助于使您的代码非常简洁:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-05
        • 2022-01-06
        • 1970-01-01
        • 1970-01-01
        • 2013-06-20
        相关资源
        最近更新 更多