コレクション内のアイテムの検索
コレクション内の条件に一致するすべてのアイテムを検索するには、findAll()関数を使用します。 探しているアイテムを識別するブール・クローズを受け入れます。
結果は、クローズがtrue
と評価されるコレクション内のすべてのアイテムのList
です。 一致するアイテムがない場合、またはコレクションが空の場合は、空のコレクションが返されます。
次に示すように、閉じをインラインで渡す場合は、カッコを外すことができます。 この例の結果は、アドレスがサフィクス
.edu
で終わるすべての受信者Eメールを含むリストです: 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') }
Map
オブジェクトのList
に適用すると、次に示すように、クローズで現在のマップのキーを名前で参照できます。 この例では、イタリアの国コード「+39-」で始まる電話番号を持つ電話帳エントリのリストを生成します。
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-') }
Map
でfindAll()
をコールすると、各評価で終了に渡されるパラメータが現在のMap
エントリになります。 各エントリには、必要に応じてクロージャ関数本文で参照できるkey
およびvalue
プロパティがあります。 結果は、クローズがtrueと評価されるエントリのみを含むMap
になります。 次の例では、結果は、name
がSteve
である2人のユーザーのマップ・エントリを含むマップです。 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' }
一致する「最初の」アイテムのみを検索するには、
findAll()
のかわりにfind()
関数を使用します。 同じブール型クローズを使用できますが、最初の一致が識別されると停止します。 findAll()
とは対照的に、find()
を使用する場合、述語に一致するアイテムがない場合、またはコレクションが空の場合はnull
が返されます。 コンパニオン関数は、次のような他の検索操作を実行するために存在します:
-
any { boolean_predicate }
- boolean_predicateがアイテムに対してtrue
を返す場合はtrueを返します -
every { boolean_predicate }
- boolean_predicateがすべてのアイテムに対してtrue
を返す場合はtrueを返します