Java 逆引き集 | Guava / Apache Commons Collections の利用(拡張ユーティリティ) — 実務ツール

Java Java
スポンサーリンク

Guava / Apache Commons Collections の利用(拡張ユーティリティ) — 実務ツール

標準 Java コレクション API は基本的な機能を提供しますが、実務では「もう少し便利なユーティリティ」が欲しくなる場面が多いです。そこで役立つのが Guava(Google 提供)Apache Commons Collections。両者とも「拡張ユーティリティ集」として、コレクション操作を簡潔に、安全に、効率的に書けるようにしてくれます。


Guava の代表機能

1. 不変コレクション(Immutable)

import com.google.common.collect.ImmutableList;

ImmutableList<String> list = ImmutableList.of("A", "B", "C");
// list.add("D"); // コンパイルは通るが実行時例外(不変)
Java
  • 用途: API から「変更不可のリスト」を返すときに安全。

2. マルチマップ(MultiMap)

import com.google.common.collect.ArrayListMultimap;

ArrayListMultimap<String, String> mm = ArrayListMultimap.create();
mm.put("fruit", "apple");
mm.put("fruit", "banana");
mm.put("veg", "carrot");

System.out.println(mm.get("fruit")); // [apple, banana]
Java
  • 用途: 1キーに複数値を簡単に紐付けたいとき。

3. BiMap(双方向マップ)

import com.google.common.collect.HashBiMap;

HashBiMap<String, Integer> bm = HashBiMap.create();
bm.put("A", 1);
bm.put("B", 2);

System.out.println(bm.inverse().get(1)); // "A"
Java
  • 用途: 値からキーを逆引きしたいとき。

4. Table(2次元マップ)

import com.google.common.collect.HashBasedTable;

HashBasedTable<String, String, Integer> table = HashBasedTable.create();
table.put("row1", "col1", 10);
table.put("row1", "col2", 20);

System.out.println(table.get("row1", "col2")); // 20
Java
  • 用途: 行×列のデータ構造を簡単に表現。

5. ユーティリティ(Lists, Sets, Maps)

import com.google.common.collect.Lists;

List<String> reversed = Lists.reverse(List.of("A","B","C"));
System.out.println(reversed); // [C, B, A]
Java
  • 用途: 標準 API では冗長な処理を一行で。

Apache Commons Collections の代表機能

1. Bag(多重集合)

import org.apache.commons.collections4.Bag;
import org.apache.commons.collections4.bag.HashBag;

Bag<String> bag = new HashBag<>();
bag.add("apple", 2);
bag.add("banana", 1);

System.out.println(bag.getCount("apple")); // 2
Java
  • 用途: 要素の出現回数を管理する「多重集合」。

2. MultiValuedMap

import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;

ArrayListValuedHashMap<String, String> mm = new ArrayListValuedHashMap<>();
mm.put("fruit", "apple");
mm.put("fruit", "banana");

System.out.println(mm.get("fruit")); // [apple, banana]
Java
  • 用途: Guava の MultiMap と同様、1キーに複数値。

3. BidiMap(双方向マップ)

import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.DualHashBidiMap;

BidiMap<String, Integer> bm = new DualHashBidiMap<>();
bm.put("A", 1);
System.out.println(bm.getKey(1)); // "A"
Java
  • 用途: 値からキーを逆引き。

4. Transformer / Predicate ユーティリティ

import org.apache.commons.collections4.CollectionUtils;

List<String> list = List.of("a","bb","ccc");
List<Integer> lengths = CollectionUtils.collect(list, String::length);
System.out.println(lengths); // [1,2,3]
Java
  • 用途: コレクション変換やフィルタを簡潔に。

例題で理解する

例題1: ログイン履歴から「ユーザーごとのアクセス回数」を集計(Bag)

Bag<String> logins = new HashBag<>();
logins.add("alice");
logins.add("bob");
logins.add("alice");

System.out.println(logins.getCount("alice")); // 2
Java

例題2: 商品カテゴリごとのアイテム管理(MultiMap)

ArrayListMultimap<String, String> items = ArrayListMultimap.create();
items.put("fruit", "apple");
items.put("fruit", "banana");
items.put("veg", "carrot");

System.out.println(items.get("fruit")); // [apple, banana]
Java

例題3: 双方向マップで「コード↔名前」変換

HashBiMap<String, String> codes = HashBiMap.create();
codes.put("JP", "Japan");
codes.put("US", "United States");

System.out.println(codes.inverse().get("Japan")); // JP
Java

テンプレート集

  • Guava Immutable
ImmutableList<T> list = ImmutableList.of(e1, e2, e3);
Java
  • Guava MultiMap
Multimap<K,V> mm = ArrayListMultimap.create();
mm.put(k, v);
Java
  • Guava BiMap
BiMap<K,V> bm = HashBiMap.create();
bm.put(k, v);
bm.inverse().get(v);
Java
  • Guava Table
Table<R,C,V> t = HashBasedTable.create();
t.put(r,c,v);
Java
  • Commons Bag
Bag<T> bag = new HashBag<>();
bag.add(e, count);
Java
  • Commons MultiValuedMap
MultiValuedMap<K,V> mm = new ArrayListValuedHashMap<>();
mm.put(k,v);
Java
  • Commons BidiMap
BidiMap<K,V> bm = new DualHashBidiMap<>();
bm.getKey(v);
Java

落とし穴と回避策

  • 依存ライブラリ: Guava/Commons Collections を導入する必要がある(Maven/Gradle)。
  • 不変 vs 可変: Guava の Immutable は変更不可。Commons の構造は可変が多い。用途に応じて選ぶ。
  • 標準 API との重複: Java 8 以降は Stream API で代替できる場面もある。ライブラリ導入コストと比較して選択。
  • 並行性: 並行用途は Concurrent 系の標準コレクションを優先。Guava/Commons は基本的に非同期対応ではない。

まとめ

  • Guava: Immutable、MultiMap、BiMap、Table など「便利な拡張構造」。
  • Apache Commons Collections: Bag、MultiValuedMap、BidiMap、ユーティリティで「頻出処理を簡潔化」。
  • 実務では「標準 API で冗長になる処理」を短く安全に書けるのが最大のメリット。
  • 導入コスト(依存ライブラリ)と標準 API での代替可能性を比較し、必要な場面で活用すると効果的です。
タイトルとURLをコピーしました