25

来自 Groovy JDK:

公共集合 grep()

迭代此 Object 表示的项目集合,并使用 IDENTITY 闭包作为过滤器返回匹配的每个项目 - 有效地返回满足 Groovy 真理的所有元素。

公共集合 findAll()

查找与 IDENTITY 闭包匹配的所有项目(即匹配 Groovy 真值)。

4

2 回答 2

24

简短的回答:结果是一样的。

长答案: grep通常使用过滤器对象,isCase然后在其上调用。因此,grep 的参数通常不是 Groovy Closure。因为findAll您使用闭包作为参数,并且如果闭包的结果被评估为真,它将被带入结果集合。

现在重要的是要知道闭包也有一个 isCase 方法。Closure#isCase(Object)将使用参数作为闭包的参数执行闭包,然后使用 Groovy Truth 对其结果进行评估。对于身份闭包,即。{it},这意味着闭包将返回给它的内容,因此 Groovy 会将Groovy Truth应用于 grep 调用的参数。结果与 findAll 相同。

于 2012-05-23T09:59:12.560 回答
6

其实两者还是有细微差别的。至少在将这些方法与地图一起使用时。

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
于 2017-05-30T13:04:27.453 回答