Подтвердить что ты не робот

Есть ли разница между методами Groovy non-argument grep() и findAll()?

Из Groovy JDK:

public Collection grep()

Итерирует по набору элементов, которые этот Объект представляет и возвращает каждый элемент, который соответствует использованию IDENTITY Closure в качестве фильтра, - эффективно возвращая все элементы, которые удовлетворяют истине Groovy.

public Collection findAll()

Находит все элементы, соответствующие закрытию IDENTITY (т.е. соответствует истине Groovy).

4b9b3361

Ответ 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