背景
想必一大部分同学都实现过Map<V,List<T>>这样的代码吧
确实看起来很多很笨重 最主要这样的代码太多

问题
我们对于这种数据用起来很不爽的是如果我们关注的是T类型但是我们要时刻保持警惕从map中取出List<T>
关注List是否存在 如果存在在list中 add T否则要newArrayList再add T
事实上这种代码太多 如果某次忘记判断就会很容易出现问题
Multimap的出现解决了该问题
Multimap
Multimap<TaMemberCardEntityExtendImport, TaMemberCardEntityExtendImport> memberCardMultimap = ArrayListMultimap.create(list.size() / EXPECTED_VALUES_PER_KEY, EXPECTED_VALUES_PER_KEY); TaMemberCardEntityExtendImport currentTemplate = null; for (TaMemberCardEntityExtendImport cardEntity : list) { cardEntity.setUseType(useType); if (cardEntity.getDataType() == DATA_TYPE_CARD_TEMPLATE) { currentTemplate = cardEntity; } else if (currentTemplate != null) { //导入时跟开卡一致,将实际金额填入vipMoney cardEntity.setVipMoney(cardEntity.getRealAmount()); cardEntity.setPrestoreAmount(cardEntity.getRealAmount()); memberCardMultimap.put(currentTemplate, cardEntity); } }
- asMap为Multimap<K, V>提供Map<K,Collection<V>>形式的视图。返回的Map支持remove操作,并且会反映到底层的Multimap,但它不支持put或putAll操作。更重要的是,如果你想为Multimap中没有的键返回null,而不是一个新的、可写的空集合,你就可以使用asMap().get(key)。(你可以并且应当把asMap.get(key)返回的结果转化为适当的集合类型——如SetMultimap.asMap.get(key)的结果转为Set,ListMultimap.asMap.get(key)的结果转为List——Java类型系统不允许ListMultimap直接为asMap.get(key)返回List
- entries用Collection<Map.Entry<K, V>>返回Multimap中所有”键-单个值映射”——包括重复键。(对SetMultimap,返回的是Set)
- keySet用Set表示Multimap中所有不同的键。
- keys用Multiset表示Multimap中的所有键,每个键重复出现的次数等于它映射的值的个数。可以从这个Multiset中移除元素,但不能做添加操作;移除操作会反映到底层的Multimap。
- values()用一个”扁平”的Collection<V>包含Multimap中的所有值。这有一点类似于Iterables.concat(multimap.asMap().values()),但它直接返回了单个Collection,而不像multimap.asMap().values()那样是按键区分开的Collection。
-
Multimap提供了多种形式的实现。在大多数要使用Map<K, Collection<V>>的地方,你都可以使用它们: