uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

1.8.1以降をキャッチアップするシリーズその1、非破壊的sort/unique

大晦日も押し迫ってきたところで連続エントリを書き始めて年の瀬の区切りを悪くする試みです。

本記事から続く一連のエントリでは、Groovy 1.8.1で追加されたGDKメソッド(主にコレクション関係)について解説してみます。

書籍「プログラミングGROOVY」を執筆した時点でのGroovy最新版は1.8.0だったのですが、それ以降の差分を押えておくことで、GDKライブラリの最新仕様に追随できる、というわけなのです。とはいうもの、書籍では全GDKメソッドを網羅的に解説しているわけではないので、もともと厳密に追随できるというわけではないです。正直言うと、自分が知らなかったので調べただけです。

なお、コレクション関係のGDKメソッドは、コレクションオブジェクト以外にも、Object[]、Iteratorなどにも適用できるものが多いです。正確なところはGDKリファレンスを参照してください。

非破壊的sort/unique

従来のsortメソッドおよびuniqueメソッドは、元のリストをソートしたり重複する要素を削除するというものでしたが、いずれも元のリストを変更してしまう破壊的操作でした。1.8.1以降ではこれらにboolean引数multableを指定できるバージョンが追加され、リストを変更せずに、「ソートしたバージョンの新しいリスト」「重複を削除したバージョンの新しいリスト」を返すことができるようになりました。

具体的にはコレクションやObject[]に以下のメソッド群が追加されました。

  • public List sort(boolean mutate)
  • public List sort(boolean mutate, Closure closure)
  • public List sort(boolean mutate, Comparator comparator)
  • public Collection unique(boolean mutate)
  • public Collection unique(boolean mutate, Closure closure)
  • public Collection unique(boolean mutate, Comparator comparator)

それぞれmutate引数にfalseを指定すると非破壊的動作になります。
trueだと従来と同じ動作です。
以下は例です。

a = [2, 3,1,4]
assert a.sort() == [1,2,3,4] // 従来のソート
assert a == [1,2,3,4] // 破壊的なのでaが変更(ソート)される

b = [2,3,1,4]
assert b.sort(false) == [1,2,3,4] // mutable=falseで非破壊的ソート
assert b == [2,3,1,4] // 非破壊的なのでbは変化しない。

c = [3,2,1,3,1,3]
assert c.unique() == [3,2,1] // 従来のunique
assert c == [3,2,1] // 破壊的なのでcが変更(重複削除)される

d = [3,2,1,3,1,3]
assert d.unique(false) == [3,2,1] // mutable=falseで重複削除
assert d == [3,2,1,3,1,3] // 非破壊的なのでdは変化しない。

続く。

追記

Groovy 2.4では、非破壊的ソート、非破壊的uniqueのために別メソッドtoSorted, toUniqueが追加されました。

プログラミングGROOVY
プログラミングGROOVY
posted with amazlet at 11.12.31
関谷 和愛 上原 潤二 須江 信洋 中野 靖治
技術評論社
売り上げランキング: 102071
では皆様、良いお年を!