このページを作っている管理人はまだ、このAPI 使い始めてまもないので誤記などがあるかもしれません。
Google Collections Libraryはグーグルが作成したコレクションライブラリーです。Googleの様々なProductで使われているようです。
新しく型の追加だけでなく使いやすくなっています。Apache 2.0ライセンスのオープンソースですので安心して使えます。
こんな素晴らしいコードを共有してくれるGoogleに感謝の念が絶えません。
JDK1.4までの拡張コレクションライブラリーの定番といえば、Jakarta Commons Collections でした。
しかしながら、それは、JDK1.5から導入されたGenericsに対応していないので使いにくい部分もあります。
(Eclipseなどで開発してみればわかりますが、警告だらけになりますし、警告を除外するとバグが発生しやすくなります)
そのため、Genericsに対応しつつ別の機能を盛り込まれたライブラリーがGoogle社内で使われていて、それがある程度固まったのでCollectionsだけ先行して1.0としてリリースされました。
将来的には、Googleが作成しているライブラリー群のguava-libraryに統合されると思います。
まだそれほど、使いこなしてはいませんが、
Genericsに対応しているのが最低条件、GAEやGWT(正式対応ではありません)やAndroidなどGoogle Productの開発をしているのなら、試す価値はあります。
(Java7でコレクションがどうなるのかという心配はあるかもしれませんが、これらGoogle Product上の開発が主なら心配ないでしょう)
またGoogle Data API内でよく使われているらしいですので、GDataを使う方は勉強しておいて損はないでしょう。
ユーティリティークラス
Lists・Maps・Setsのこれらクラスだけでも、Google Collectionsを導入の元が取れるかもしれません。
無いときは、こういう風に普通にかかないといけません。
この時何が問題かというとGenericsの宣言が2回出てきて見難いです。
List<String> list=new ArrayList<String>();
Map<String ,String> map=new HashMap<String, String>();
このように、Lists.newArrayList()のようになり、読みやすくなります。
まあEclipseとか補完機能使えば、どちらでも入力の手間は変わりませんが
List<String> list=Lists.newArrayList();
Map<String ,String> map=Maps.newHashMap();
GWT上でのGoogle Collections Library
GWTでもかなりのクラスが動くように思えます。上級者向けになりますが詳しくはこちらFunctionとPredicate
FuctionとPredicateという便利な仕組みがあります。これを使うとforループ中のif文などを消せてコードの可読性と再利用性が高まります。
GoogleCollectionsではMultimapに注目が集まり気味ですが、このFunctionとPredicateもかなり面白いです。
このFunctionとPredicateは引数と返り値の型の違いなどでいろいろなクラスから呼び出されます。
Collectionsだけjdkのapiの名前かぶってCollections2になったようですね。
私も使い始めのころはIteratorばかり使っていましたが、型に合わせて使い分けるといいみたいです。
Iterable all any find filter transform | Collections2 filter transform | Lists transform |
Sets filter | ||
Maps filterEntries filterKeys filterValues uniqueIndex transformValues |
変換後の型変換は、ImmutableListやImmutableSetのcopyOf()やof()などを使うと楽かも
既存のクラス
FunctionsやPredicatesクラスにはいくつかのよく使うものがあります。
Functions
- compose - 一つ目のFunctionを値を2つ目のFunctionの元にして値を返します
- constant - 常に一定の値を返します
- forMap - mapから値を取り出します。(値がnullの場合、IllegalArgumentExceptionになります。)
- forMap - mapから値を取り出します。デフォルト値指定 (値がnullの場合デフォルトに置き換わります。)
- forPredicate - Predicateの結果のBooleanを返します
- identity - 変換元をそのまま返します
- toStringFunction - toString()した文字列を返します
Predicates
andやorやnotを組み合わせることでかなり複雑な条件を作成出来ます。
- alwaysFlase - 常にfalseを返します
- alwaysTrue - 常にtrueを返します
- and - 複数のPredicateを合わせた結果を返します
- compose - Functionの変換後の値をpredicateに渡します
- equals - 同じどうか
- in - collectionに含まれるかどうか
- instanceOf - クラスのインスタンスかどうか
- isNull - nullかどうか
- not - 結果を逆にします
- notNull - nullでないかどうか
- or - 複数のPredicateのいずれかがtrueの場合、trueを返します
使用例
半角カナから全角カナなど各種日本語変換を、Functionベースに作成してみました。
Forwarding Collections
デコレーションパターンを使ってCollection系のクラスを簡単に拡張するためのクラス群です。
独自の機能を加えたListやSetなどを作成できます。