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的行为
ArrayListMultimapHashMapArrayList
HashMultimapHashMapHashSet
LinkedListMultimapLinkedHashMapLinkedList
LinkedHashMultimapLinkedHashMapLinkedHashMap
TreeMultimapTreeMapTreeSet
ImmutableListMultimapImmutableMapImmutableList
ImmutableSetMultimapImmutableMapImmutableSet

 

 

 

 

 

 

 

 

 

根据不同业务需求,选择不同的实现类。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值