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 |
根据不同业务需求,选择不同的实现类。