javaでComparable
インタフェースを使うような場面でも、Groovyならクロージャでサクッと書ける。
例えばフォルダ配下のファイルを名前昇順に処理したいときはこのようにします。
File dir = new File("/tmp")
dir.listFiles().sort {
left, right ->
left.name <=> right.name
}.each {
// 処理
}
listFiles()
メソッドはFile配列を返します。それに対してsort
メソッドのクロージャを記述しています。sort
のクロージャでは比較するオブジェクト2つの引数をとります。今回は名前で比較しています。(<=>
が比較を意味します)
逆順にソートしたいときは、入れ替えて right.name <=> left.name
とすればよいです。
2つ以上の条件で比較したいとき。例えば更新日時と名前でソートしたいときは次のようになります。
File dir = new File("/tmp")
dir.listFiles().sort {
left, right ->
left.lastModified() <=> right.lastModified() ?: left.name <=> right.name
}.each {
// 処理
}
「 <=>
」は宇宙船演算子と呼ぶらしいです。A <=> B
と記述した時、A<B
なら-1
、A==B
なら0
、A>B
なら1
を返します。
上記の例ではクロージャは特にreturn
を使わず、最後の演算を比較結果としていますが、明示的に-1,0,1
を返す書き方ももちろん可能です。
println(
[1,2,3,4,5,6].sort {
a, b ->
if (b == 3) return 1
if (a == 3) return -1
return a <=> b
})
[3, 1, 2, 4, 5, 6]