2015/04/21 このエントリーをはてなブックマークに追加 はてなブックマーク - Javaのコレクションフレームワークで物足りないならGS Collections使ったほうが良いかもしれない

Javaのコレクションフレームワークで物足りないならGS Collections使ったほうが良いかもしれない







最近ちょっと話題になっているJavaのコレクションフレームワークライブラリである、
Goldman Sachs社のGS Collectionsというライブラリを試してみました。
GS Collections - GitHub



Java Day TokyoやJJUG CCC 2015 Springで僕は興味を持ち始めました。




結論としては題名通り。




2015年4月現在、Qiitaのこの記事が一番わかり易いと思うので、
細かい使い方はこちらを見ると良いと思います。
GS Collections 使い方メモ







GS Collections にはselectやdetect、BagなどJavaの人から見ると
見慣れない言葉が出てきますが、
Smalltalkのコレクションから派生してきているということを踏まえると納得がいきます。

ついでに言うと、Rubyを普段使い慣れている人からすればとっつきやすいのかもしれない。


コレクションクロージャメソッド - Smalltalkのtは小文字です
コレクションクロージャメソッド - 日本語bliki


ここでSmalltalkとRubyが比較されていますが、だいたいのことはGS Collectionsが実現してくれます。





GS Collectionsには社内研修用にGS Collections Kataというカリキュラムが用意されています。 https://github.com/goldmansachs/gs-collections-kata


Exercise1Test...Exercise8Testまでテストがあるのですが、
それぞれをグリーンにしていけば、
それだけでGS Collectionsの使い勝手が結構分かるようになります!
このカリキュラムすごい!

テストをしながらテスト対象のリファクタリングを行うあたりが盛り込まれてるのも良くて、
GS Collectionsを覚えながら、テストファーストを体感させるものになってます。



基本的に先ほどのQiitaの記事を見つつ、ソースコメントのヒントを見れば
解いていけると思います。


Exercise6、7、8が結構難しかった!



・Stream APIでいう、◯◯がすぐに思いつかない

まぁ、これは単純に慣れの問題です。
僕の勝手な覚え方としては

Java SE 8GS Collections役割
filterselect要素の絞り込み
mapcollectオブジェクトの変換
flatMapflatCollect入れ子になってるやつを平らにしてオブジェクトに変換


ってな感じで、大体これぐらい覚えておけばなんとかなりました笑


・縦の問題、横の問題が起きにくい

bitter_foxさんの言葉をお借りすると、ソースコードが手続き的な処理で
間延びしてしまう縦の問題や、Stream APIのメソッドチェインにより発生してしまう
横の問題は多少は起こりにくく、簡潔に書けるようになります。


コレクションに関してはCollection#streamが操作の起点になると思うのですが、
GS Collectionsの場合はライブラリに含まれているので省略できます。



縦の問題、横の問題についてはJavaエンジニア養成読本の
[マルチコアCPU対応]Java SE 8時代のデータ入門
第2章「縦の問題」を解決するラムダ式をチェック!





・LazyかLazyでないか

また、JavaのStreamの場合は終端操作が発生されるまで処理は行われない
遅延処理だと思いますが(あんまり自信ない)、GS Collectionsの場合はそうではありません。
asLazyなどのメソッドで遅延評価か先行評価かを選択できるよな設計になっています。



・ImmutableかMutableか

イミュータブル、ミュータブルの違いがクラスレベルで色濃く出ているライブラリです。
Java標準のCollections#unmodifiablelistようにイミュータブルであっても
実行時にしかチェックが行えないということはなく、
静的に制限をかけられるというのは結構な利点です。





下の図が分かりやすいなぁと思いました。


http://www.infoq.com/jp/articles/GS-Collections-by-Example-1より引用






ちょっとだけ残念なところを書いときます

・答えと問題が微妙に違う

多分問題と答えでバージョンが違っちゃってます…ので、微妙に読解力を試されます笑
これはissueなりプルリクなりGitHubに投げた方が良いんでしょうね
まぁ、そんなめちゃくちゃ困るレベルでもないです

・Immutableのオブジェクトを使うケースがない

GS Collectionsの仕組みは分かるものの、何も考えない人は
「なるほど、これを真似して全部ミュータブルにしちゃえばいいんだな!」
とか思わないかちょっとだけ不安・・・!

・Bagの特性があまり体感できない

これは僕がそう思っただけかもしれません。







ということで、GS Collectionsの紹介とGS Collections Kata良いよって話をしました。
あと、Smalltalk由来であることと、簡単なStream APIとの比較とかも書いてみました。


GS Collections Kataは本当に良く出来ているので、
Stream APIで全て書き換えてみるのも面白いかもしれません。


ひと通り、やり終えたあとで自分のコードをリファクタリングするのも楽しいです
PredicatesやFunctionsという便利なクラスがあるので、それで書き換えたり、
メソッド参照に置き換えたりなど考えればよりシンプルになります。


いろんな方がいろんな形でオススメしている記事を見ましたが、
僕としてはSmalltalk好きやRuby好きにオススメ出来るかなと思いました。
あと、Javaにミュータブル、イミュータブルをしっかり持ち込みたい人にもオススメです。

Guavaで良いんじゃない?って思う人もいるかもしれませんが、
僕はGuava使ったこと無いのでなんとも言えない…というところです笑

僕も使えるところがあれば使っていきたいなぁと思います。

あとSmalltalkに興味がわきました!(ミーハー)






参考
実例で学ぶGS Collections – Part 1
GS-Collectionsはcode kataで練習すると面白い - mike-neckのブログ
GS Collections Kata をひと通りやった - tokuhirom's blog
gs-collections-kataをやってみた - 水まんじゅう




0 件のコメント:

コメントを投稿

GA