Groovy的非参数grep()和findAll()方法之间有什么区别吗?

时间:2012-05-22 14:06:02

标签: groovy

来自Groovy JDK:

public Collection grep()

  

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

public Collection findAll()

  

查找与IDENTITY Closure匹配的所有项目(即匹配Groovy真理)。

2 个答案:

答案 0 :(得分:23)

简答:结果将是相同的。

答案很长: grep通常使用过滤器对象,然后调用isCase。因此grep的参数通常不是Groovy Closure。对于findAll,您使用Closure作为参数,如果Closure的结果被评估为true,则将其带入生成的集合中。

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

答案 1 :(得分:3)

实际上两者之间存在细微差别。 至少在将这些方法与地图一起使用时。

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