はじめに
最近ちょっと話題になっているJavaのコレクションフレームワークライブラリである、
Goldman Sachs社のGS Collectionsというライブラリを試してみました。
GS Collections - GitHub
Java Day TokyoやJJUG CCC 2015 Springで僕は興味を持ち始めました。
結論としては題名通り。
2015年4月現在、Qiitaのこの記事が一番わかり易いと思うので、
細かい使い方はこちらを見ると良いと思います。
GS Collections 使い方メモ
Smalltalk由来のCollectionフレームワーク
GS Collections にはselectやdetect、BagなどJavaの人から見ると
見慣れない言葉が出てきますが、
Smalltalkのコレクションから派生してきているということを踏まえると納得がいきます。
ついでに言うと、Rubyを普段使い慣れている人からすればとっつきやすいのかもしれない。
コレクションクロージャメソッド - Smalltalkのtは小文字です
コレクションクロージャメソッド - 日本語bliki
ここでSmalltalkとRubyが比較されていますが、だいたいのことはGS Collectionsが実現してくれます。
GS Collections Kataで使い方をつかむ
GS Collectionsには社内研修用にGS Collections Kataというカリキュラムが用意されています。 https://github.com/goldmansachs/gs-collections-kata
Exercise1Test...Exercise8Testまでテストがあるのですが、
それぞれをグリーンにしていけば、
それだけでGS Collectionsの使い勝手が結構分かるようになります!
このカリキュラムすごい!
テストをしながらテスト対象のリファクタリングを行うあたりが盛り込まれてるのも良くて、
GS Collectionsを覚えながら、テストファーストを体感させるものになってます。
基本的に先ほどのQiitaの記事を見つつ、ソースコメントのヒントを見れば
解いていけると思います。
Exercise6、7、8が結構難しかった!
Java SE8 のStream APIと比較して
まぁ、これは単純に慣れの問題です。
僕の勝手な覚え方としては
Java SE 8 | GS Collections | 役割 |
---|---|---|
filter | select | 要素の絞り込み |
map | collect | オブジェクトの変換 |
flatMap | flatCollect | 入れ子になってるやつを平らにしてオブジェクトに変換 |
ってな感じで、大体これぐらい覚えておけばなんとかなりました笑
bitter_foxさんの言葉をお借りすると、ソースコードが手続き的な処理で
間延びしてしまう縦の問題や、Stream APIのメソッドチェインにより発生してしまう
横の問題は多少は起こりにくく、簡潔に書けるようになります。
コレクションに関してはCollection#streamが操作の起点になると思うのですが、
GS Collectionsの場合はライブラリに含まれているので省略できます。
縦の問題、横の問題についてはJavaエンジニア養成読本の
[マルチコアCPU対応]Java SE 8時代のデータ入門
第2章「縦の問題」を解決するラムダ式をチェック!
また、JavaのStreamの場合は終端操作が発生されるまで処理は行われない
遅延処理だと思いますが(あんまり自信ない)、GS Collectionsの場合はそうではありません。
asLazyなどのメソッドで遅延評価か先行評価かを選択できるよな設計になっています。
イミュータブル、ミュータブルの違いがクラスレベルで色濃く出ているライブラリです。
Java標準のCollections#unmodifiablelistようにイミュータブルであっても
実行時にしかチェックが行えないということはなく、
静的に制限をかけられるというのは結構な利点です。
下の図が分かりやすいなぁと思いました。
http://www.infoq.com/jp/articles/GS-Collections-by-Example-1より引用
困ったところ
ちょっとだけ残念なところを書いときます
多分問題と答えでバージョンが違っちゃってます…ので、微妙に読解力を試されます笑
これはissueなりプルリクなりGitHubに投げた方が良いんでしょうね
まぁ、そんなめちゃくちゃ困るレベルでもないです
GS Collectionsの仕組みは分かるものの、何も考えない人は
「なるほど、これを真似して全部ミュータブルにしちゃえばいいんだな!」
とか思わないかちょっとだけ不安・・・!
これは僕がそう思っただけかもしれません。
まとめ
ということで、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 件のコメント:
コメントを投稿