Groovy > Listの使い方

更新日 2019-11-14
広告
Groovyは、JavaScriptのリテラル表記っぽく、リストを定義できます。
def list = []
list.add(20)
list.add("test")
以下は、サンプル ListSample.groovy です。
def list = [10, 50, 'sweng', new Date()]
println(list[0]) // 要素0にアクセス
println(list[2]) // 要素2にアクセス
println(list.get(3)) // 要素3にアクセス
println(list.size()) // リストのサイズ
実行結果は以下のようになります。
$ groovy ListSample
10
sweng
Wed Aug 15 16:20:50 JST 2012
4

for-in文

for-in文で、リストをループできます(ListSample2.groovy)。
def list = [10, 50, 'sweng', new Date()]
for (item in list) { 
  println(item)
}
実行結果は以下のようになります。
$ groovy ListSample2
10
50
sweng
Wed Aug 15 16:24:01 JST 2012

each

リストの各要素に対して、メソッド(クロージャ)を適用することも簡単にかけます(ListSample3.groovy)。
def list = [10, 50, 'sweng', new Date()]
list.each { item -> println "--- $item ---" }
波カッコの最初に、配列の各要素を表す変数名を宣言します。上の例では item としています。変数名を宣言しないと、デフォルトで it となります。ListSample3.groovy の実行結果は以下のようになります。
$ groovy ListSample3
--- 10 ---
--- 50 ---
--- sweng ---
--- Wed Aug 15 16:31:22 JST 2012 ---
事前に定義したクロージャを適用することもできます。クロージャの内容が多い場合は、こちらのほうがコードが見やすいかもしれません(ListSample4.groovy)。
def closure = { item ->
  def text = "xxxxx $item xxxxx"
  println text
}
def list = [10, 50, 'sweng', new Date()]
list.each { closure.call(it) }
これを実行すると、以下の結果になります。
$ groovy ListSample4
xxxxx 10 xxxxx
xxxxx 50 xxxxx
xxxxx sweng xxxxx
xxxxx Wed Aug 15 16:41:03 JST 2012 xxxxx
リストの要素番号(インデックス)を利用した処理を行いたい場合は、eachWithIndexを使います。
[10, 50, 'sweng', new Date()].eachWithIndex { 
  item, index -> println "${index} --> ${item}" 
}
実行結果は、以下のようになります。
0 --> 10
1 --> 50
2 --> sweng
3 --> Wed Aug 15 17:45:11 JST 2012

collect

collectを使うと、クロージャを適用した結果を、新しいリストとして取得できます。
def list = [10, 50, 100]
def newList = list.collect { it * 2 }
println list
println newList
実行結果は以下です。
 groovy ListSample5
[10, 50, 100]
[20, 100, 200]

find/findAll

findは、クロージャの適用結果が「最初に真」になる要素を返します。findAllは、クロージャの適用結果が「真」になる要素を全て返します。
def list = [10, 50, 100]
def newList = list.find { it > 30 } // 要素 50 が返される
println newList

def newList2 = list.findAll { it > 30 } // 要素 50と100 が返される
println newList2
実行結果は以下です。
$ groovy ListSample6
50
[50, 100]

every/any

everyは、クロージャの適用結果が「全て真」になる場合に、trueを返します。anyは、クロージャの適用結果が「1つでも真」になる場合に、trueを返します。
def list = [10, 50, 100]

def result1 = list.every { it > 5 }
println result1

def result2 = list.any { it > 70 } // 要素100が真になるのでtrue
println result2
実行結果は以下です。
$ groovy ListSample7
true
true

first/last

firstは先頭の要素を返します。 lastは最後の要素を返します。
def list = [10, 50, 100]
list.first() // -> 10
list.last() // -> 100

max/min

maxは要素中の最大値を、minは要素中の最小値を返します。
def list = [10, 50, 100]
def max = list.max()
def min = list.min()
println "${max}/${min}"
実行結果は以下です。
$ groovy ListSample8
100/10

join

引数文字列で、配列の各要素を連結します。
def list = ['a', 'b', 'c']
println list.join(',')
実行結果は以下です。
$ groovy ListSample9
a,b,c

sort

ソートする方法を紹介します。
def list = [5, 4, 12]
println list.sort() // 昇順でソート
println list.sort{ it * -1 } // 降順でソート
println list.sort().reverse() // 降順でソート
この実行結果は以下のようになります。
[4, 5, 12]
[12, 5, 4]
[12, 5, 4]
クロージャを使って、オブジェクトをソートすることも可能です。 以下の例は、Dataオブジェクトをソートします。
import groovy.transform.ToString

def dataList = [new Data(id: 5), new Data(id: 4), new Data(id: 12)]
def sortedList = dataList.sort { data1, data2 -> // 昇順ソート
  return data1.id - data2.id
}
println dataList

@ToString
class Data { 
  Integer id
}
実行結果は以下のようになります。
$ groovy ListSample12.groovy 
[Data(4), Data(5), Data(12)]
広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system