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);

results matching ""

    No results matching ""