¿Hay alguna diferencia entre los métodos grep() y findAll() sin argumentos de Groovy?
Frecuentes
Visto 3,624 veces
25
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).
2 Respuestas
24
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
6
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 groovy or haz tu propia pregunta.
¿Revisaste la fuente? Están en
/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
. - Dave Newton