guava Multimap学习

拼搏现实的明天。 2022-10-16 07:22 260阅读 0赞

背景

有时候我们可能需要这样一种数据结构,k 为 一个Object,valuse 为一个集合。如果使用jdk自带的Map。处理起来是极为不方便的,需要如何处理呢?我们来看看

  1. Map<Integer, List<String>> map = new HashMap<>();
  2. String[] test = { "狄仁杰", "阿离", "小卤蛋"};
  3. for (String s : test) {
  4. // 插入 1
  5. List<String> list = map.get(1);
  6. if (Objects.nonNull(list)) {
  7. list.add("狄仁杰");
  8. } else {
  9. ArrayList<String> item = new ArrayList<>();
  10. item.add("狄仁杰");
  11. map.put(1, item);
  12. }
  13. }
  14. System.out.println(map.get(1));

如果我们使用 guava中的Multimap呢,使用起来非常方便

  1. Multimap<Integer,String> multimap = ArrayListMultimap.create();
  2. multimap.put(1, "狄仁杰");
  3. multimap.put(1, "阿离");
  4. multimap.put(1, "小卤蛋");
  5. multimap.put(2, "韩信");
  6. multimap.put(2, "李白");
  7. multimap.put(2, "猴哥");

无需判断key 是否存在,直接无脑put就可以了。
我们看看Multimap接口的核心方法。

这里我的guava版本为: 30.1.1-jre。其实目前在业务中还没用过这种数据结果,为什么会研究呢,其实是看了guava的 消费者模式 SubscriberRegistry 中的 register方法会用到这个高级数据结构就研究了一下,这里贴出部分register的源码给大家看看
在这里插入图片描述

在这里插入图片描述
一些常用api加了一点注释其实用法基本和map相差不大。后续可以自己使用体会

  1. {
  2. // 返回所有 values 的size,不会返回multimap中不同键的个数
  3. int size();
  4. //判断Multimap是否包含key、value
  5. boolean isEmpty();
  6. // Multimap中是否包含指定key的value值
  7. boolean containsKey(@CompatibleWith("K") @Nullable Object key);
  8. // Multimap中是否包含指定value的key
  9. boolean containsValue(@CompatibleWith("V") @Nullable Object value);
  10. //Multimap中是否包含指定的key-value pair的数据
  11. boolean containsEntry(@CompatibleWith("K") @Nullable Object key, @CompatibleWith("V") @Nullable Object value);
  12. boolean put(@Nullable K key, @Nullable V value);
  13. boolean remove(@CompatibleWith("K") @Nullable Object key, @CompatibleWith("V") @Nullable Object value);
  14. @CanIgnoreReturnValue
  15. boolean putAll(@Nullable K key, Iterable<? extends V> values);
  16. boolean putAll(Multimap<? extends K, ? extends V> multimap);
  17. @CanIgnoreReturnValue
  18. Collection<V> replaceValues(@Nullable K key, Iterable<? extends V> values);
  19. @CanIgnoreReturnValue
  20. Collection<V> removeAll(@CompatibleWith("K") @Nullable Object key);
  21. //清空Imultimap中的数据
  22. void clear();
  23. Collection<V> get(@Nullable K key);
  24. //获取所有的key集合
  25. Set<K> keySet();
  26. Multiset<K> keys();
  27. Collection<V> values();
  28. Collection<Entry<K, V>> entries();
  29. default void forEach(BiConsumer<? super K, ? super V> action) {
  30. checkNotNull(action);
  31. entries().forEach(entry -> action.accept(entry.getKey(), entry.getValue()));
  32. }
  33. Map<K, Collection<V>> asMap();
  34. }

发表评论

表情:
评论列表 (有 0 条评论,260人围观)

还没有评论,来说两句吧...

相关阅读

    相关 guava学习:RangeSet

    RangeSet类是用来存储一些不为空的也不相交的范围的数据结构。假如需要向RangeSet的对象中加入一个新的范围,那么任何相交的部分都会被合并起来,所有的空范围都会被忽略。