¿Hay alguna diferencia entre los métodos grep() y findAll() sin argumentos de Groovy?

Desde Groovy JDK:

Colección pública grep()

Itera sobre la colección de elementos que representa este Objeto y devuelve cada elemento que coincide usando el Cierre de IDENTIDAD como filtro, devolviendo de manera efectiva todos los elementos que satisfacen la verdad de Groovy.

colección pública findAll()

Encuentra todos los elementos que coincidan con el Cierre de IDENTIDAD (es decir, que coincidan con la verdad Groovy).

preguntado el 22 de mayo de 12 a las 15:05

¿Revisaste la fuente? Están en /main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java. -

2 Respuestas

Respuesta corta: el resultado será el mismo.

Respuesta larga: grep normalmente utiliza un objeto de filtro, en el que isCase entonces se llama. Como tal, el argumento para grep normalmente no es Groovy Closure. Para findAll usa un Closure como argumento, y si el resultado del Closure se evalúa como verdadero, se incluye en la colección resultante.

Ahora es importante saber que un Closure también tiene un método isCase. Closure#isCase(Object) ejecutará el Closure utilizando el argumento como argumento para el Closure y el resultado se evaluará utilizando Groovy Truth. Para un cierre de identidad, es decir. {it}, esto significa que el cierre devolverá lo que se le da, por lo que se aplicará Groovy Verdad maravillosa al argumento de la llamada grep. El resultado es entonces el mismo que con findAll.

Respondido el 18 de Septiembre de 15 a las 19:09

Creo que la respuesta corta debería dejar claro que el resultado es el mismo cuando se usa un cierre pero grep puede utilizar otros tipos de parámetros. - madth3

Si entiendo La respuesta de Pedro Witzel correctamente, otra diferencia más importante es que grep aparentemente siempre devuelve un ArrayList, independientemente del tipo de colección de entrada. - mklement0

En realidad hay una ligera diferencia entre ambos. Al menos cuando se usan esos métodos con mapas.

grep devuelve un ArrayList, Cuando findAll devuelve un Map.

Aquí sigue un ejemplo:

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

contestado el 30 de mayo de 17 a las 14:05

La diferencia es que grep devuelve una lista pero findAll devuelve una colección que tiene el mismo tipo que la de origen. - aristóteles

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.