Java|Guava中这些Map的优秀操作,让我的代码量减少了50%( 二 )


Map<String Map<String Integer>> rowMap = table.rowMap();Map<String Map<String Integer>> columnMap = table.columnMap();

查看转换格式后的Map中的内容 , 分别按照行和列进行了汇总:
{Hydra={Jan=20 Feb=28 Trunks={Jan=28 Feb=16
{Jan={Hydra=20 Trunks=28 Feb={Hydra=28 Trunks=16

BiMap - 双向Map在普通Map中 , 如果要想根据value查找对应的key , 没什么简便的办法 , 无论是使用for循环还是迭代器 , 都需要遍历整个Map 。 以循环keySet的方式为例:
public List<String> findKey(Map<String String> map String val){
   List<String> keys=new ArrayList<>();    for (String key : map.keySet()) {        if (map.get(key).equals(val))
           keys.add(key);
       return keys;


而guava中的BiMap提供了一种key和value双向关联的数据结构 , 先看一个简单的例子:
HashBiMap<String String> biMap = HashBiMap.create();
biMap.put(\"Hydra\"\"Programmer\");
biMap.put(\"Tony\"\"IronMan\");
biMap.put(\"Thanos\"\"Titan\");//使用key获取valueSystem.out.println(biMap.get(\"Tony\"));
BiMap<String String> inverse = biMap.inverse();//使用value获取keySystem.out.println(inverse.get(\"Titan\"));

执行结果 , :
IronManThanos

看上去很实用是不是?但是使用中还有几个坑得避一下 , 下面一个个梳理 。
1、反转后操作的影响上面我们用inverse方法反转了原来BiMap的键值映射 , 但是这个反转后的BiMap并不是一个新的对象 , 它实现了一种视图的关联 , 所以对反转后的BiMap执行的所有操作会作用于原先的BiMap上 。
HashBiMap<String String> biMap = HashBiMap.create();
biMap.put(\"Hydra\"\"Programmer\");
biMap.put(\"Tony\"\"IronMan\");
biMap.put(\"Thanos\"\"Titan\");
BiMap<String String> inverse = biMap.inverse();
inverse.put(\"IronMan\"\"Stark\");
System.out.println(biMap);

对反转后的BiMap中的内容进行了修改后 , 再看一下原先BiMap中的内容:
{Hydra=Programmer Thanos=Titan Stark=IronMan

可以看到 , 原先值为IronMan时对应的键是Tony , 虽然没有直接修改 , 但是现在键变成了Stark 。
2、value不可重复BiMap的底层继承了Map , 我们知道在Map中key是不允许重复的 , 而双向的BiMap中key和value可以认为处于等价地位 , 因此在这个基础上加了限制 , value也是不允许重复的 。 看一下下面的代码:
HashBiMap<String String> biMap = HashBiMap.create();
biMap.put(\"Tony\"\"IronMan\");
biMap.put(\"Stark\"\"IronMan\");

这样代码无法正常结束 , 会抛出一个IllegalArgumentException异常:

如果你非想把新的key映射到已有的value上 , 那么也可以使用forcePut方法强制替换掉原有的key:
HashBiMap<String String> biMap = HashBiMap.create();
biMap.put(\"Tony\"\"IronMan\");
biMap.forcePut(\"Stark\"\"IronMan\");

打印一下替换后的BiMap:
{Stark=IronMan

顺带多说一句 , 由于BiMap的value是不允许重复的 , 因此它的values方法返回的是没有重复的Set , 而不是普通Collection:
Set<String> values = biMap.values();

Multimap - 多值Mapjava中的Map维护的是键值一对一的关系 , 如果要将一个键映射到多个值上 , 那么就只能把值的内容设为集合形式 , 简单实现如下:
Map<String List<Integer>> map=new HashMap<>();
List<Integer> list=new ArrayList<>();list.add(1);list.add(2);map.put(\"day\"list);

guava中的Multimap提供了将一个键映射到多个值的形式 , 使用起来无需定义复杂的内层集合 , 可以像使用普通的Map一样使用它 , 定义及放入数据如下: