最近Groovyを触っていなかったのでなんとなく素数を求めてみた。
def isPrimeNumber = { Integer num ->
num >= 2 ? (2..<num).every{num % it} : false
}
assert isPrimeNumber(2)
assert isPrimeNumber(3)
assert isPrimeNumber(5)
assert isPrimeNumber(7)
assert isPrimeNumber(11)
assert isPrimeNumber(4) == false
コレだけだと普通なので、自分が今回一番最初に書いたコードも残しておく。以下の通り。
def isPrimeNumber = { Integer num ->
def r = (2..num).collect{
num % it == 0
}
r.findAll{it == true}.size() == 1
}
なんかもっとスマートにできないのか。。。?と思い以下のように修正
def isPrimeNumber = { Integer num ->
(2..<num).every{ num % it }
}
で、2未満の値が渡された際にfalseを返すようにした。それが今回最初に提示したコード。
余談になるけどクロージャの引数にちゃんとInteger型として明示してあるので、クロージャの中で渡された値が本当に数値なのかをチェックする必要はない。