来自 Groovy JDK:
公共集合 grep()
迭代此 Object 表示的项目集合,并使用 IDENTITY 闭包作为过滤器返回匹配的每个项目 - 有效地返回满足 Groovy 真理的所有元素。
公共集合 findAll()
查找与 IDENTITY 闭包匹配的所有项目(即匹配 Groovy 真值)。
来自 Groovy JDK:
迭代此 Object 表示的项目集合,并使用 IDENTITY 闭包作为过滤器返回匹配的每个项目 - 有效地返回满足 Groovy 真理的所有元素。
查找与 IDENTITY 闭包匹配的所有项目(即匹配 Groovy 真值)。
简短的回答:结果是一样的。
长答案:
grep
通常使用过滤器对象,isCase
然后在其上调用。因此,grep 的参数通常不是 Groovy Closure。因为findAll
您使用闭包作为参数,并且如果闭包的结果被评估为真,它将被带入结果集合。
现在重要的是要知道闭包也有一个 isCase 方法。Closure#isCase(Object)
将使用参数作为闭包的参数执行闭包,然后使用 Groovy Truth 对其结果进行评估。对于身份闭包,即。{it}
,这意味着闭包将返回给它的内容,因此 Groovy 会将Groovy Truth应用于 grep 调用的参数。结果与 findAll 相同。
其实两者还是有细微差别的。至少在将这些方法与地图一起使用时。
grep
返回一个ArrayList
,当findAll
返回一个Map
。
下面是一个例子:
def l_map = [a:1, b:2, c:3]
def map_grep = l_map.grep { it.key == 'a' || it.value == 2}
def map_findAll = l_map.findAll { it.key == 'a' || it.value == 2}
println map_grep
println map_findAll
assert l_map instanceof Map
assert map_grep instanceof ArrayList
assert map_findAll instanceof Map