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


RangeMap<Integer String> rangeMap = TreeRangeMap.create();
rangeMap.put(Range.closedOpen(060)\"fail\");
rangeMap.put(Range.closed(6090)\"satisfactory\");
rangeMap.put(Range.openClosed(90100)\"excellent\");
System.out.println(rangeMap.get(59));
System.out.println(rangeMap.get(60));
System.out.println(rangeMap.get(90));
System.out.println(rangeMap.get(91));

在上面的代码中 , 先后创建了[060)的左闭右开区间、[6090
的闭区间、(90100
的左开右闭区间 , 并分别映射到某个值上 。 运行结果打印:
failsatisfactory
satisfactory
excellent

当然我们也可以移除一段空间 , 下面的代码移除了[7080
这一闭区间后 , 再次执行get时返回结果为null:
rangeMap.remove(Range.closed(7080));System.out.println(rangeMap.get(75));

ClassToInstanceMap - 实例MapClassToInstanceMap是一个比较特殊的Map , 它的键是Class , 而值是这个Class对应的实例对象 。 先看一个简单使用的例子 , 使用putInstance方法存入对象:
ClassToInstanceMap<Object> instanceMap = MutableClassToInstanceMap.create();
User user=new User(\"Hydra\"18);
Dept dept=new Dept(\"develop\"200);
instanceMap.putInstance(User.classuser);instanceMap.putInstance(Dept.classdept);

使用getInstance方法取出对象:
User user1 = instanceMap.getInstance(User.class);System.out.println(user==user1);

运行结果打印了true , 说明了取出的确实是我们之前创建并放入的那个对象 。
【Java|Guava中这些Map的优秀操作,让我的代码量减少了50%】大家可能会疑问 , 如果只是存对象的话 , 像下面这样用普通的Map也可以实现:
Map<ClassObject> map=new HashMap<>();
User user=new User(\"Hydra\"18);
Dept dept=new Dept(\"develop\"200);
map.put(User.classuser);map.put(Dept.classdept);

那么 , 使用ClassToInstanceMap这种方式有什么好处呢?
首先 , 这里最明显的就是在取出对象时省去了复杂的强制类型转换 , 避免了手动进行类型转换的错误 。 其次 , 我们可以看一下ClassToInstanceMap接口的定义 , 它是带有泛型的:
public interface ClassToInstanceMap<B> extends Map<Class<? extends B> B>{...

这个泛型同样可以起到对类型进行约束的作用 , value要符合key所对应的类型 , 再看看下面的例子:
ClassToInstanceMap<Map> instanceMap = MutableClassToInstanceMap.create();
HashMap<String Object> hashMap = new HashMap<>();
TreeMap<String Object> treeMap = new TreeMap<>();
ArrayList<Object> list = new ArrayList<>();
instanceMap.putInstance(HashMap.classhashMap);
instanceMap.putInstance(TreeMap.classtreeMap);

这样是可以正常执行的 , 因为HashMap和TreeMap都集成了Map父类 , 但是如果想放入其他类型 , 就会编译报错:

所以 , 如果你想缓存对象 , 又不想做复杂的类型校验 , 那么使用方便的ClassToInstanceMap就可以了 。
总结本文介绍了guava中5种对Map的扩展数据结构 , 它们提供了非常实用的功能 , 能很大程度的简化我们的代码 。 但是同时使用中也有不少需要避开的坑 , 例如修改关联的视图会对原始数据造成影响等等 , 具体的使用中大家还需要谨慎一些 。