Есть ли разница между методами Groovy non-argument grep() и findAll()?
Из Groovy JDK:
Итерирует по набору элементов, которые этот Объект представляет и возвращает каждый элемент, который соответствует использованию IDENTITY Closure в качестве фильтра, - эффективно возвращая все элементы, которые удовлетворяют истине Groovy.
Находит все элементы, соответствующие закрытию IDENTITY (т.е. соответствует истине Groovy).
Ответы
Ответ 1
Короткий ответ: результат будет таким же.
Длинный ответ:
grep
обычно использует объект фильтра, на который затем вызывается isCase
. Таким образом, аргумент grep обычно не заключен в Groovy Closure. Для findAll
вы используете аргумент Closure as, и если результат Closure оценивается как true, он берется в результирующий набор.
Теперь важно знать, что Closure также имеет метод isCase. Closure#isCase(Object)
выполнит Closure, используя аргумент в качестве аргумента для Closure, и результат его затем оценивается с помощью Groovy Truth. За закрытие идентичности, т.е. {it}
, это означает, что замыкание вернет то, что ему дано, таким образом Groovy применит Groovy Истину к аргументу вызова grep. Результат тогда будет таким же, как с findAll.
Ответ 2
На самом деле существует небольшая разница между обоими.
По крайней мере, при использовании этих методов с картами.
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