Edited at
JavaDay 23

GS Collections Kata で Eclipse Collections をはじめよう!

More than 3 years have passed since last update.


はじめに - Eclipse Collections とは

Eclipse Collections という Java のコレクションフレームワークがあります。

とても使いやすく、完成度の高いフレームワークです。


標準のコレクション + Stream API の上位互換

Eclipse Collections は、ごく端的に言うと、Java の標準のコレクションと Stream API の上位互換ということができます。


  • 標準のコレクションや Stream API でできることができる

  • 標準のコレクションや Stream API でできないこともできる

ということです。


使ってたのしい API

Java を使っていると、「○○(データ構造や関数の名前)が××言語にはあるのに Java にはない」とか、「Stream API であれができたらいいのに」とか思うことがあると思います。

たとえば、私は C++ から Java に来たので、std::multimap があれば……とか、std::set_intersection があれば……とか、なんでイミュータブルかどうかが実行時にしかチェックできないんだ……とか、思うことがよくあります。

ごくざっくりした言い方で、主観ですが、Eclipse Collections にはそういうのがだいたいあります

「これがやりたい」と思ったときに「あるやん!」となる気持ちよさが Eclipse Collections にはあります。

Eclipse Collections は使ってたのしい API です。


GS Collections から Eclipse Collections へ

これまであえて Eclipse Collections という名前だけを使ってきましたが、実はこれは GS Collections として 2012 年から公開されているフレームワークを改名したものです。


GS Collections 7.0 = Eclipse Collections 7.0 1

GS Collections は、投資銀行として有名なゴールドマン・サックスの社内フレームワークとして開発されました。

2012 年に GitHub で公開され、誰でも使えるようになりましたが、コントリビューションは受け付けていませんでした。

これから先、よりコミュニティに開かれたフレームワークとして、積極的にコントリビューションも受け付けていこうということで、プロジェクトを Eclipse Foundation に移管し、名称も Eclipse Collections に変更されます。

機能的には、GS Collections 7.0 と Eclipse Collections 7.0 とはまったく同一になります。唯一違うのは、パッケージ名だけです。

そのため、これから紹介する GS Collections Kata で習得した知識がそのまま Eclipse Collections にも適用できます。


【祝】2015/12/25 Eclipse Collections が公開されました

Eclipse Collections は 2015/12/25 に晴れて公開されました!

これまでは「Eclipse Collections が公開されるまでは GS Collections が使えます」とアナウンスされていましたが、これからは Eclipse Collections を使うことができます。

これまで GS Collections 7.0 を使っていた人は、パッケージ名の変更だけで Eclipse Collections に置き換えられるはずです。


ここまでのまとめ

ここまでで紹介したことについては、先日の JJUG CCC 2015 Fall での伊藤さんのセッション資料を見るとより詳しいことがわかります。

ここではあえて語らなかったパフォーマンス面でのメリットなどについても触れられています。

気になるところのある方は、参照してみてください。


GS Collections Kata ではじめよう

さて、Eclipse Collections すなわち GS Collections には、ゴールドマン・サックスが社内研修でも使用している入門エクササイズである「GS Collections Kata」があります。

「Kata」というのは、武道の「型」のことですね。

型を一つ一つ稽古することで、基礎が身につくということだと思います。 2

「使ってたのしい API」の項でも書いたように、Eclipse Collections = GS Collections はとても気持ちいいので、GS Collections Kata をキメると病みつきになります

GS Collections Kata でぜひ GS Collections = Eclipse Collections をはじめてみてください。


補足情報 : Eclipse Collecitons Kata が出る予定です

プロジェクトのロードマップによると、2016 年 2 月に Eclipse Collections 7.1 のリリースが予定されています。

ここに "Migrate the GS Collections Kata to the Eclipse Collections Kata." という項目があり、ついに Eclipse Collections Kata がリリースされるようです!

といっても、ロードマップの記述から見て大きく内容が変わることはないと思うので、安心して GS Collections Kata に取り組んでください。


準備

さて、GS Collections Kata は GitHub でホスティングされています。

GS Collections 本体もこの GS Collections Kata に含まれている3ので、自分で以下の 3 つだけ用意します。


  • JDK 5 以上

  • Eclipse か IntelliJ IDEA

  • JUnit 4

JDK については、ラムダ式・メソッド参照が使えることや、後で紹介するスライドで Java 8 が使われていることもあり、JDK 8 以降が断然オススメです。

とはいえ、GS Collections(Eclipse Collections)自体は JDK 5 以降であれば使えます。4

あとは、


  • master の zip をダウンロードして展開

  • 出てきたプロジェクトをインポート

これで準備完了です。簡単ですね。

IntelliJ IDEA でのセットアップ手順として、2015 年 5 月に開催された JJUG ナイトセミナー 「GS Collections 道場」の準備資料が有益です。

私は普段 Eclipse を使っているのですが、いい機会だし IntelliJ IDEA も使ってみたいなと思ってこの手順通りに進めたらまったくハマることなくてグッドでした。


実践

セットアップができたら、ざくざく進めましょう!

エクササイズは、予め用意された JUnit のテストケースを成功させていく形式です。

2015/12/23 時点の master では、Exercise1Test から Exercise8Test までがあります。

gsck.png

テスト対象のクラスやテストデータは予め用意されていて、はじめはすべてのテストが失敗する状態になっています。

やることとしては、コードに書かれているコメントの指示に従って、上から順に粛々とテストをグリーンにしていくだけです。

一部、テストではなく、テスト対象のクラスのコードをリファクタリングする課題もあります。(それもコメントとして書かれています)


補足資料


公式(イチオシ)

私は、GitHub ページからもリンクされている以下の資料を参照しながら進めました。

公式の資料であり、簡単な英語が読める人ならイチオシの資料です。

機能の紹介→それを使うエクササイズ→次の機能の紹介→... という順序で進むので、とてもスムーズに学習を進められます。

注意点として、エクササイズの番号が資料のものと現在の master のものとでずれているので、少し混乱するかもしれません。

おおむね以下のような対応関係になっています。

資料
master

Exercise 1
Exercise 1

Exercise 2
Exercise 2

Exercise 3
Exercise 2

Exercise 4
Exercise 3

Exercise 5
Exercise 4

Exercise 6
Exercise 5

Exercise 7
Exercise 6

Exercise 8
Exercise 7

Exercise 9
Exercise 8

いくつか master にはあっても資料に説明がないものもありますが、一部なので、進めるのに支障はないと思います。


@opengl-8080 さんの記事

一通りまとまっていて便利です。

先の資料を使わない人は、随時こちらに目を通しながら進めるとよいかもしれません。


API ドキュメント

Javadoc も一応リンクしておきますが、実は私は一度も参照しませんでした。

Kata のコードの中に色々とヒント(コメント)が書いてありますし、インターフェースや名前も直感的でわかりやすいので、必要になりませんでした。5


メソッド名対応表

ただ、Java の Stream API とメソッド名の付け方が違って混乱する場面もあるかもしれません。6

よく使うもの、かつ混乱しやすいものだけ対応表を載せておきます。

Stream API
GS Collections

map
collect

flatMap
flatCollect

filter
select / reject 7

collect
なし 8


感想とまとめ - Eclipse Collections をはじめよう


あっという間でした

GS Collections Kata は順調すぎるくらい順調に進み、セットアップを始めてから 5 時間くらいで一息に終えてしまいました。

私は伊藤さんのセッションや事前調査を通してどういう API なのかだいたい把握していたので、余計にスムーズに進んだのだとは思いますが、本当にひっかかりの少ない API だなと再認識しました。


Kata を終えるのにどれくらいかかる?

それほどの事前知識がなくても、Java のコレクションや Stream API をある程度触っている人であれば、前出の公式スライドに記載されている目安程度の時間で終えられると思います。


  • エクササイズパート : 10~30 分 × 9 エクササイズ → 2 時間半くらい

  • 準備や調査・読み物パート等 : 1 エクササイズあたり 30 分程度? × 9 → 4 時間半くらい?

もちろん人によると思いますが、ざっくり 7 時間くらいかければ終わりそうです。


はじめよう!

GS Collections Kata は、使ってたのしい API を、親切なガイドに従ってテンポよく使っていくことで GS Collections = Eclipse Collections の使い方を学べる素敵コンテンツです。

もちろん、必ずしも一気に進める必要はなくて、たとえばこつこつと 1 週間に 1 パートずつ進めてもだいじょうぶです。

ある程度 Java でコレクションや Stream API を触ってきて、もどかしい思いをしたことのある人なら、Kata を進めるにつれて、きっと Eclipse Collections = GS Collections のとりこになると思います。

GS Collections Kata でぜひ Eclipse Collections をはじめてみてください!


付録 : 始める前に見たページ

以下のようなページを見て、始められそうだな、始めたいな、と感じたのでした。

始めるかどうか迷っている方は、見てみてください。

前出のものも再掲しておきます。





  1. 後述の通り、厳密には、パッケージ名(だけ)が異なります。 



  2. プログラミングの練習に「型」を用いるという考え方自体は Dave Thomas が広めたもので、10 年以上前からあります。参考 : http://codekata.com 



  3. なお、2015/12/23 時点でバンドルされている GS Collections は 6.0 です。API に大きな変更はないので、入門には何ら問題ありません。 



  4. Eclipse Collections 8.0 から、JDK 8 以降のサポートに切り替える計画があるようです。 



  5. それから IDEA のコード補完も強力でした。Eclipse から乗り換えようかな……。 



  6. Smalltalk 由来の名付けなのだそうです。参考 : http://www.infoq.com/jp/articles/GS-Collections-by-Example-1 



  7. 条件を満たすものを残す select、条件を満たすものを除外する reject、と二種類用意されています。これには、.filter(!cond) みたいなコードを見て(結局どっちだっけ?)と混乱することがない、というメリットがあります。 



  8. Stream API とは設計が異なるため、直接対応するものがありません。