« Back to Home

Guavaのススメ

Guava: Google Core Libraries for Java 1.5+

GoogleのJavaユーティリティライブラリで、Apache Commons の Lang、Collectionsなどに替わる機能を提供してくれるものです。コンパクトながら、かゆいところに手が届く良質なAPIになっていると思います。

いくつかの機能を紹介します。

コレクションの全ての要素を変換したい

List<A>を基にしてList<B>を作るとします。

ライブラリを使わない場合はこんな感じになるでしょう。

List<B> blist = new ArrayList<B>(alist.size());
for (A a : alist) {
  blist.add(new B(a));
}

Guavaを使う場合は次のように書きます。

List<B> blist = Lists.transform(alist, new Function<A, B>(){
  @Override
  public B apply(A a) {
    return new B(a);
  }
});

おや? どこかで見たような・・・。そう、Commons CollectionsのListUtilsと似ています。が、あちらはジェネリクスを使わないので、ダサいキャストが必要になります。

このリスト変換の利点は、要素を使う時(リストから要素を取り出そうとした時)に初めて変換が行われるところにあります。

キャメルケースとスネークケースの相互変換

ちなみにキャメルケースとは、単語の頭文字を大文字にして結合した文字列の形式(someString)、スネークケースとは、単語間をアンダースコアで結合した文字列の形式(some_string)です。

例えばDBを扱うときに多いですね。Java内ではキャメルケース・DB内ではスネークケースを使ってる場合、変換が必要になることがありますが、自前で実装するのは結構大変で面倒です。こんな場面ではCaseFormatというenumを使います。

キャメルケースからスネークケースへの変換

String str = LOWER_CAMEL.to(LOWER_UNDERSCORE, "someString");
assert str == "some_string";

スネークケースからキャメルケースへの変換

String str = LOWER_UNDERSCORE.to(LOWER_CAMEL, "some_string");
assert str == "someString";

コレクションの文字列連結

Joinerというクラスを使います。

List<String> list = Arrays.asList("aaa", "bbb", "ccc");
String str = Joiner.on(", ").join(list);
assert str == "aaa, bbb, ccc";

Maven

セントラルリポジトリに登録されていますので、Mavenからの使用も可能です。

dependencyの記述は以下の通りです。(現時点での最新バージョンはr07)

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>r07</version>
</dependency>

公式ドキュメント

http://code.google.com/p/guava-libraries/