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

Arm*_*and 23 groovy

来自Groovy JDK:

public Collection grep()

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

public Collection findAll()

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

bla*_*rag 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相同.

  • 我认为简短的回答应该清楚地表明,当使用闭包时结果是相同的*但是`grep`可以使用其他类型的参数. (14认同)

Ped*_*zel 6

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

grep返回 a ArrayList,当findAll返回 a 时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
Run Code Online (Sandbox Code Playgroud)