Map 特殊操作
java.util.Collections、commons.collections4.MapUtils中,同樣提供不少Map常用的操作與特殊的 MAP 實作可使用。以下列舉一些較常用的情境參考。
Class Name | Method | 說明 |
---|---|---|
Collections | synchronizedMap(Map) | 回應synchronized MAP |
Collections | unmodifiableMap(Map) | 回應不可變MAP |
Collections | emptyMap() | 回應空白MAP |
CollectionUtils | isEmpty | 檢查map是否為null或空。 |
MapUtils | lazyMap | Get時動態建立value的map實作。 |
UdeMapUtils
UDE 所提供的擴展共用函式庫,說明如下:
LazyMap / MultiValueMap / Multimap
LazyMap,也就是以下形式的MAP 用例,根據經驗是相當常見的需求。
final TargetType obj ;
if (map.contains(key)) {
obj = map.get(key);
} else {
obj = new TargetType();
map.put (key , obj)
}
而 CommonsCollection / Spring中的 MultiValueMap 也可以算是LazyMap的一種變形: Map< Key, Collection< Type > >。
UdeMapUtils 統一提供 lazyMapXXX() 靜態工廠方法,以建立 LazyMap。
// 自訂實際的MAP實作、get時,若指定KEY值不存在,自動使用傳入的Prototype產出一份。
// 複製方式的優先順序如下:public clone method / public copy constructor / serialization clone
<K, V> Map<K, V> lazyMap(Map<K, V>, V prototype)
// 同上,但 MAP 使用預設的 HashMap 實作。
<K, V> Map<K, V> lazyMap(V prototype)
// 未使用過的鍵值,可建立空白 ArrayList 回傳
<K, V> Map<K, List<V>> lazyMapToList()
<K, V> Map<K, List<V>> lazyMapToList(Map<K, List<V>> srcMap)
// 未使用過的鍵值,可建立空白 HashSet 回傳
<K, V> Map<K, Set<V>> lazyMapToSet()
<K, V> Map<K, Set<V>> lazyMapToSet(Map<K, Set<V>> srcMap)
// 未使用過的鍵值,以 Transformer 建立物件 回傳
<K, V> Map<K, V> factoryMap(Transformer<? super K, ? extends V> transformer)
<K, V> Map<K, V> factoryMap(Map<K, V> srcMap, Transformer<? super K, ? extends V> transformer)
反轉 MAP (key-value) 對應內容
反轉MAP (key-value) 對應內容,因為key 對 value 可為1對多,所以回傳的結果會是 Map< V, Set < K > >。 當原先 Map 中的 value 為集合物件時,則使用 invertMulti(...)。
- invert(Map
) - invertMulti(Map
>)
// Map<Integer, List<String>> map : {5=[A, B, C, C], 10=[A]}
// invertMap : {A=[5, 10], B=[5], C=[5]}
Map<String, Set<Integer>> invertMap = UdeMapUtils.invertMulti(map);