Guava 之 Multimap

Multimap 是 guava 包下的一個接口,是一個 (key, collection) 類型的集合.

Multimap 接口方法:

@GwtCompatible
public interface Multimap<K, V> {
  //返回Multimap集合的key、value pair的數量  
  int size();
  //判斷Multimap是否包含key、value pair
  boolean isEmpty();
  //判斷Multimap中是否包含指定key的value值
  boolean containsKey(@Nullable Object key);
  //判斷Multimap中是否包含指定value的key
  boolean containsValue(@Nullable Object value);
  //判斷Multimap中是否包含指定的key-value pair的數據
  boolean containsEntry(@Nullable Object key, @Nullable Object value);
  //將數據加入到Multimap中
  boolean put(@Nullable K key, @Nullable V value);
  //刪除Multimap中指定key-value pair
  boolean remove(@Nullable Object key, @Nullable Object value);
  //將指定的key-集合數據加入Multimap中
  boolean putAll(@Nullable K key, Iterable<? extends V> values);
  //將指定的Multimap和當前的Multimap合併
  boolean putAll(Multimap<? extends K, ? extends V> multimap);
  //替換指定key的value
  Collection<V> replaceValues(@Nullable K key, Iterable<? extends V> values);
  //刪除Imultimap中的指定key數據
  Collection<V> removeAll(@Nullable Object key);
  //清空Imultimap中的數據
  void clear();
  //獲取指定key的值
  Collection<V> get(@Nullable K key);
  //獲取所有的key集合
  Set<K> keySet();

  Multiset<K> keys();

  Collection<V> values();

  Collection<Map.Entry<K, V>> entries();

  Map<K, Collection<V>> asMap();
}

場景:有一批學生名單,需要按學生姓名進行分類。

使用 HashMap 實現:


        List<Student> studentList = createStudentList();
        Map<String, List<Student>> studentNameMap = new HashMap<>();

        for (Student student : studentList) {
            List<Student> students = studentNameMap.get(student.getName());
            if (students == null) {
                students = new ArrayList<>();
                studentNameMap.put(student.getName(), students);
            }

            students.add(student);
        }

使用 lambda 表達式優化代碼:

        List<Student> studentList = createStudentList();
        Map<String, List<Student>> studentNameMap = new HashMap<>();

        for (Student student : studentList) {
            List<Student> students = studentNameMap.computeIfAbsent(student.getName(), k -> new ArrayList<>());
            students.add(student);
        }

需要判斷List爲null並初始化。

 

使用 Multimap 實現:

        //獲取一個 key 爲 String, value 爲 List 的 Multimap實例
        Multimap<String, Student> multiMap = ArrayListMultimap.create();
        List<Student> studentList = createStudentList();

        //初始化 multimap
        studentList.forEach(student -> multiMap.put(student.getName(), student));

 

Multimap.get(key) 並不會返回一個 null 對象,如果該 key 不存在返回的是一個空的集合,所以在使用過程中注意,不能用 null 來判斷 key 是否出現在multimap中。

 

Multimap 實現類:

實現類 key的行爲 value的行爲
ArrayListMultimap HashMap ArrayList
HashMultimap HashMap HashSet
LinkedListMultimap LinkedHashMap LinkedList
LinkedHashMultimap LinkedHashMap LinkedHashMap
TreeMultimap TreeMap TreeSet
ImmutableListMultimap ImmutableMap ImmutableList
ImmutableSetMultimap ImmutableMap ImmutableSet

 

 

 

 

 

 

 

 

 

根據不同業務需求,選擇不同的實現類。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章