gpt4 book ai didi

Groovy - 编写类似闭包的 Unix grep 的更短方法

转载 作者:行者123 更新时间:2023-12-04 20:48:56 25 4
gpt4 key购买 nike

我有一个闭包来查找名称与模式匹配并包含给定字符串的所有文件:

def path = "path/to/logs"
def namePatten = ~/.*.log/
def contentPattern ~/.*ERROR.*/
def result = []

new File(path).eachDirRecurse { File dir ->
dir.eachFileMatch(namePattern) { File f ->
f.eachLine { String l ->
if(l.matches(contentPattern)) {
result.add(f)
return
}
}
}

但我很确定我可以有更短的东西(嘿,否则我可以使用普通的 java :))
我试图找到一种方法来写这个有点像这样:
result = new File(path).eachFileRecurse.filter(filePattern).grep(contentPattern)
就像我使用 Guava 或类似的流畅界面收集工具所做的那样。

你如何以简洁但仍然可读的方式编写这个闭包?

最佳答案

目前我能做到的最小的是使用 File.traverse method递归扫描根文件夹:

new File( path ).traverse( nameFilter: namePattern ) { f ->
if( f.filterLine( { it ==~ contentPattern } ) as String ) result << f
}
使用 filterLine 返回 Writable我将其转换为字符串,然后我们可以利用 Groovy 真理来查看是否将文件添加到 result或不。

编辑:
您也可以使用 AntBuilder做类似的事情:
def result = new AntBuilder().fileset( dir:'path/to/logs', includes:'**/*.log' ) {
containsregexp expression:'.*ERROR.*'
}*.file
我倾向于使用它一次性生成列表,而不是将结果添加到已定义的 results列表。

关于Groovy - 编写类似闭包的 Unix grep 的更短方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12951349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com