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 |
根據不同業務需求,選擇不同的實現類。