guava Multimap学习
背景
有时候我们可能需要这样一种数据结构,k 为 一个Object,valuse 为一个集合。如果使用jdk自带的Map。处理起来是极为不方便的,需要如何处理呢?我们来看看
Map<Integer, List<String>> map = new HashMap<>();
String[] test = { "狄仁杰", "阿离", "小卤蛋"};
for (String s : test) {
// 插入 1
List<String> list = map.get(1);
if (Objects.nonNull(list)) {
list.add("狄仁杰");
} else {
ArrayList<String> item = new ArrayList<>();
item.add("狄仁杰");
map.put(1, item);
}
}
System.out.println(map.get(1));
如果我们使用 guava中的Multimap呢,使用起来非常方便
Multimap<Integer,String> multimap = ArrayListMultimap.create();
multimap.put(1, "狄仁杰");
multimap.put(1, "阿离");
multimap.put(1, "小卤蛋");
multimap.put(2, "韩信");
multimap.put(2, "李白");
multimap.put(2, "猴哥");
无需判断key 是否存在,直接无脑put就可以了。
我们看看Multimap接口的核心方法。
这里我的guava版本为: 30.1.1-jre。其实目前在业务中还没用过这种数据结果,为什么会研究呢,其实是看了guava的 消费者模式 SubscriberRegistry 中的 register方法会用到这个高级数据结构就研究了一下,这里贴出部分register的源码给大家看看
一些常用api加了一点注释其实用法基本和map相差不大。后续可以自己使用体会
{
// 返回所有 values 的size,不会返回multimap中不同键的个数
int size();
//判断Multimap是否包含key、value
boolean isEmpty();
// Multimap中是否包含指定key的value值
boolean containsKey(@CompatibleWith("K") @Nullable Object key);
// Multimap中是否包含指定value的key
boolean containsValue(@CompatibleWith("V") @Nullable Object value);
//Multimap中是否包含指定的key-value pair的数据
boolean containsEntry(@CompatibleWith("K") @Nullable Object key, @CompatibleWith("V") @Nullable Object value);
boolean put(@Nullable K key, @Nullable V value);
boolean remove(@CompatibleWith("K") @Nullable Object key, @CompatibleWith("V") @Nullable Object value);
@CanIgnoreReturnValue
boolean putAll(@Nullable K key, Iterable<? extends V> values);
boolean putAll(Multimap<? extends K, ? extends V> multimap);
@CanIgnoreReturnValue
Collection<V> replaceValues(@Nullable K key, Iterable<? extends V> values);
@CanIgnoreReturnValue
Collection<V> removeAll(@CompatibleWith("K") @Nullable Object key);
//清空Imultimap中的数据
void clear();
Collection<V> get(@Nullable K key);
//获取所有的key集合
Set<K> keySet();
Multiset<K> keys();
Collection<V> values();
Collection<Entry<K, V>> entries();
default void forEach(BiConsumer<? super K, ? super V> action) {
checkNotNull(action);
entries().forEach(entry -> action.accept(entry.getKey(), entry.getValue()));
}
Map<K, Collection<V>> asMap();
}
还没有评论,来说两句吧...