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

# はじめに - 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 年から公開されているフレームワークを改名したものです。

* [Eclipse Collections](https://projects.eclipse.org/proposals/eclipse-collections)

### GS Collections 7.0 = Eclipse Collections 7.0 [^1]

[^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（日本語公式ページ）](https://www.eclipse.org/collections/ja)
* [Eclipse Collections | projects.eclipse.org](https://projects.eclipse.org/projects/technology.collections)
* [eclipse/eclipse-collections - GitHub](https://github.com/eclipse/eclipse-collections)

これまでは「Eclipse Collections が公開されるまでは GS Collections が使えます」とアナウンスされていましたが、これからは Eclipse Collections を使うことができます。
これまで GS Collections 7.0 を使っていた人は、パッケージ名の変更だけで Eclipse Collections に置き換えられるはずです。

## ここまでのまとめ

ここまでで紹介したことについては、先日の JJUG CCC 2015 Fall での伊藤さんのセッション資料を見るとより詳しいことがわかります。
ここではあえて語らなかったパフォーマンス面でのメリットなどについても触れられています。

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

* [GS CollectionsからEclipse Collectionsへ - 機能豊富なオープンソースJavaコレクションフレームワーク
](http://www.goldmansachs.com/gs-collections/documents/2015-11-28_JJUG_CCC.pdf)

# GS Collections Kata ではじめよう

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

「Kata」というのは、武道の「型」のことですね。
型を一つ一つ稽古することで、基礎が身につくということだと思います。 [^2]

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

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

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

[プロジェクトのロードマップ](https://github.com/eclipse/eclipse-collections/wiki/Roadmap)によると、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 でホスティングされています。

* https://github.com/goldmansachs/gs-collections-kata

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

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

* JDK 5 以上
* Eclipse か IntelliJ IDEA
* JUnit 4

JDK については、ラムダ式・メソッド参照が使えることや、後で紹介するスライドで Java 8 が使われていることもあり、JDK 8 以降が断然オススメです。
とはいえ、GS Collections（Eclipse Collections）自体は JDK 5 以降であれば使えます。[^4]

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

あとは、

* master の zip をダウンロードして展開
* 出てきたプロジェクトをインポート

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

IntelliJ IDEA でのセットアップ手順として、2015 年 5 月に開催された JJUG ナイトセミナー 「[GS Collections 道場](https://jjug.doorkeeper.jp/events/25323)」の準備資料が有益です。

* [GS Collections Kata セットアップガイド](http://www.slideshare.net/jjug/gs-collections-kata-setup-guide-2015-jjug-night-seminar-48273435)

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

## 実践

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

エクササイズは、予め用意された JUnit のテストケースを成功させていく形式です。
2015/12/23 時点の master では、Exercise1Test から Exercise8Test までがあります。

![gsck.png](https://qiita-image-store.s3.amazonaws.com/0/9734/566703e4-79a8-150d-3ea7-08ffe2847732.png)

テスト対象のクラスやテストデータは予め用意されていて、はじめはすべてのテストが失敗する状態になっています。
やることとしては、コードに書かれているコメントの指示に従って、上から順に粛々とテストをグリーンにしていくだけです。

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

### 補足資料

#### 公式（イチオシ）

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

* [GS Collections and Java 8 Lambdas - Code Kata](http://www.goldmansachs.com/gs-collections/documents/GS%20Collections%20Training%20Session%20and%20Kata%205.0.0.pdf)

公式の資料であり、簡単な英語が読める人ならイチオシの資料です。
機能の紹介→それを使うエクササイズ→次の機能の紹介→... という順序で進むので、とてもスムーズに学習を進められます。

注意点として、エクササイズの番号が資料のものと現在の 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 さんの記事

* [GS Collections 使い方メモ](http://qiita.com/opengl-8080/items/a13773e0653800e23323)

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

#### API ドキュメント

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

* [GS Collections - 6.0.0](http://www.goldmansachs.com/gs-collections/javadoc/6.0.0/)（Kata にバンドルされているバージョン）
* [GS Collections - 7.0.0](http://www.goldmansachs.com/gs-collections/javadoc/7.0.0/)（最新版）

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

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

#### メソッド名対応表

ただ、Java の Stream API とメソッド名の付け方が違って混乱する場面もあるかもしれません。[^6]
よく使うもの、かつ混乱しやすいものだけ対応表を載せておきます。

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

|Stream API|GS Collections|
|:--|:--|
|map|collect|
|flatMap|flatCollect|
|filter|select / reject [^7]|
|collect|なし [^8]|

[^7]: 条件を満たすものを残す select、条件を満たすものを除外する reject、と二種類用意されています。これには、.filter(!cond) みたいなコードを見て（結局どっちだっけ？）と混乱することがない、というメリットがあります。
[^8]: Stream API とは設計が異なるため、直接対応するものがありません。

# 感想とまとめ - 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 をはじめてみてください！

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

以下のようなページを見て、始められそうだな、始めたいな、と感じたのでした。
始めるかどうか迷っている方は、見てみてください。

* [GS-Collectionsはcode kataで練習すると面白い](http://mike-neck.hatenadiary.com/entry/2015/04/16/075014)
* [Javaのコレクションフレームワークで物足りないならGS Collections使ったほうが良いかもしれない](http://yyyank.blogspot.jp/2015/04/javagscollections.html)

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

* [GS CollectionsからEclipse Collectionsへ - 機能豊富なオープンソースJavaコレクションフレームワーク
](http://www.goldmansachs.com/gs-collections/documents/2015-11-28_JJUG_CCC.pdf)
* [実例で学ぶGS Collections – Part 1](http://www.infoq.com/jp/articles/GS-Collections-by-Example-1)