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 での代替可能性を比較し、必要な場面で活用すると効果的です。
