Finding Items in a Collection
To find all items matching a condition in a collection, use the findAll() function. It accepts a boolean closure identifying the items you're looking for.
The result is a List of all items in the collection for which the
closure evaluates to true. If no item matches or the collection is
empty, then an empty collection is returned.
As shown below, you can leave off the parentheses if passing the closure in-line. The
result of this example is a list containing all recipient emails whose address ends with
the
.edu
suffix:def recipients = ['sjc@example.edu','dan@example.com',
'spm@example.edu','jim@example.org']
// Pass boolean closure using implicit "it" parameter with find criteria
// (using safe-navigation operator in case any element is null)
def eduAddreses = recipients.findAll{ it?.endsWith('.edu') }
When applied to a List of Map objects, your closure can
reference the current map's keys by name as shown below. This example produces a list of
phone book entries having a phone number that starts with the country code "+39-" for
Italy.
def phonebook = [
[name: 'Steve', phone: '+39-123456789'],
[name: 'Joey', phone: '+1-234567890'],
[name: 'Sara', phone: '+39-345678901'],
[name: 'Zoe', phone: '+44-456789123']
]
def italianFriends = phonebook.findAll { it?.phone?.startsWith('+39-') }
If you call
findAll() on a Map, then the parameter
passed to the closure on each evaluation is the current Map entry. Each
entry has a key and value property you can reference
in the closure function body if necessary. The result is a Map
containing only the entries for which the closure evaluates to true. In the example
below, the result is a map containing the two users' map entries whose
name is
Steve.def users = [
'smuench':[name:'Steve', badge:'A123'],
'jevans':[name:'Joe', badge:'B456'],
'sburns':[name:'Steve', badge:'C789']
]
def usersNamedSteve = users.findAll { it?.value.name == 'Steve' }
To find only the first matching item, use the
find()
function instead of findAll(). It accepts the same boolean closure but
stops when the first match is identified. Note that in contrast to
findAll(), when using find() if no item matches
the predicate or the collection was empty to begin with then null is
returned.Companion functions exist to perform other searching operations like:
-
any { boolean_predicate }— returns true if boolean_predicate returnstruefor any item -
every { boolean_predicate }— returns true if boolean_predicate returnstruefor every item