入手方法
Google Collections Libraryは、http://code.google.com/p/google-collections/からダウンロードできます。本稿の執筆時点のバージョンは0.5です。実際、現時点でAPIの安定性について保証が得られていないので、APIに変更が生じる可能性があり、それによって本稿のサンプルが実態にそぐわなくなることも考えられます。しかし、生じる差異はわずかで、うまくすれば簡単に修正できるものと思われます。
このライブラリをプロジェクトで実際に利用する手順は簡単で、ダウンロードしたアーカイブを解凍して、そこに含まれるjarファイルをインクルードするだけです。Javadocとソースファイルのアーカイブも提供されており、たいていの統合開発環境(IDE)では、ライブラリを定義するとき、それらがjarファイルに結び付けられます。これでライブラリをより簡単に使えるようになり、またプロジェクトのデバッグも容易になります。
簡単なサンプル
まずは簡単な機能をいくつか見ていきましょう。簡単とは言っても、どれも私のお気に入りの機能です。最初に紹介するのは、「補助クリエータ」(Convenience Creators)です。
前述のジェネリックスを用いた、何かをリストにマップする例をもう一度見てみましょう。
Map<String, List<String>> mapOfLists =
new HashMap<String, List<String>>();
これが多くの開発者にとって当たり前のスタイルなのではないでしょうか。実際、私はこれよりずっと複雑なコレクションの宣言や初期化の型シグニチャを書いてきました。必ずと言ってよいほど、その左辺と右辺の両方でこのシグニチャが繰り返されていました。
Java 7に向けて提案されている型推論を適用すると、上の例は次のように書き換えられます。
Map<String, List<String>> mapOfLists =
new HashMap<>();
確かに改善が見られます。こう書いても、コンパイラは常識的な推論に基づきnew HashMapのジェネリック(総称的)な型シグニチャを組み立てるために必要な情報を引き出せるに違いありません。ですが、このスタイルが正式に採用されるかどうかは、もう少し様子を見る必要があるでしょう。
しかし、当座はGoogle Collections Libraryの別の機能を利用すれば、この冗長性を回避できます。
Map<String, List<String>> mapOfLists = Maps.newHashMap();
Maps.newHashMap()は、Google Collections Library内のMapsというユーティリティクラスで定義されている静的メソッドです。これはJavaにおけるジェネリックスの実装上の抜け穴を突いたもので、補助クリエータnewHashMapに型シグニチャを渡すことは実際には必要ないのです。Javaのすべての標準コレクションとGoogleの新しいコレクションのすべてについて、対応する同様の補助クリエータが用意されています。この単純なアイデアだけでコードの可読性がこれほど向上するとは驚きです。
たとえば、
List<String> listOfStrings =
new ArrayList<String>();
は、次のように書き換えることができます。
List<String> listOfStrings = Lists.newArrayList();
コレクションと直接は関係ありませんが、Joinクラスのjoinメソッドも便利です。joinメソッドが用意されているPythonのようなスクリプト言語を使ったことがある人なら、すぐわかるはずです。array(配列)、collection(コレクション)、iterable、またはvarargs(可変長引数)によるリストから取り出したアイテムを結合したストリングを作ることができます。最初のパラメータは、結合対象の要素の間に置かれる区切り記号です。たとえば、サブディレクトリのコレクションからファイルのパスを作るには、次のようにします。
String[] subdirs = new String[] {"usr", "local", "lib"}; String directory = Join.join(PATH_SEPARATOR, subdirs);
取り立てて説明するほど新しい機能ではありませんが、必要なのは多分このメソッドくらいなもので、実際、これを使うことでコードを自作する手間が省けます。
