読者です 読者をやめる 読者になる 読者になる

No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

Groovyのループいろいろ

Groovy

はじめに

Groovyではループ処理がJavaより格段に便利になっている。ということでメモしておく。
以下ソースはいずれも Groovy Version: 1.5.7 JVM: 1.6.0_10 で動作確認を行いました。

forループ

昔ながらの
def array = [0, 1, 2, 3, 4]
for (int i = 0; i < array.size(); i++) {
  assert array[i] == i
}

for-inでループ

コレクションのループ
def array = [0, 1, 2, 3, 4]
def nums = ''
for (i in array) {
  nums += i 
}
assert nums == '01234'
範囲(Range)でループ
def nums = ''

// 0〜4
for (i in 0..4) {
  nums += i
}
assert nums == '01234'

nums = ''
// 0〜5より小さい
for (i in 0..<5) {
  nums += i
}
assert nums == '01234'

nums = ''
// 4〜0 (逆範囲)
for (i in 4..0) {
  nums += i 
}
assert nums == '43210'

nums = ''
// 4〜0より大きい (逆範囲)
for (i in 4..<0) {
  nums += i 
}
assert nums == '4321'

クロージャでループ

コレクションをループ
def array = [0, 1, 2, 3, 4]
def nums = ''

// 各要素ごとに繰り返し
array.each {
  nums += it
}
assert nums == '01234'

nums = ''
// 各要素ごとに逆順で繰り返し
array.reverseEach {
  nums += it
}
assert nums == '43210'
範囲(Range)を利用して
def nums = ''
// 範囲を直接eachで回す
(0..4).each {
  nums += it  
}
assert nums == '01234'

// 範囲はIntRangeクラス
def r = new IntRange(0, 4)
assert r == 0..4
nums = ''
r.each {
  nums += it  
}
assert nums == '01234'

繰り返し用のメソッドでループ

times
def nums = ''
10.times { nums += it }
assert nums == '0123456789'
upto, downto
def nums = ''
0.upto(9) { nums += it }
assert nums == '0123456789'

nums = ''
9.downto(0) { nums += it }
assert nums == '9876543210'
step
def nums = ''
0.step(8, 2) { nums += it }
assert '02468'

参考

Groovy JDK API Specification

Groovyイン・アクション

Groovyイン・アクション