guava新集合类型——Multimap

时间:2021-02-23 20:47:25

guava的大名其实是早有耳闻,但直到前段时间才真正用到了,也切实感受到了为什么那么多开发者都推崇guava。
第一个用到guava的是它的一个集合类型:Multimap。
我们有时候会碰到一些比较复杂的数据结构,诸如:Map<K, List<V>>。这样的结构无论是拼装还是读取都会觉得比较烦。如果是调用第三方服务,对方给你返回的是这种结构的话,你还得遍历出来,然后进行数据的转换之后再重新拼装。相信对很多人来讲都会苦不堪言。
这个时候如果知道guava的Multimap的话,就会觉得立刻变得简单了许多。接下来看一个实际场景:
要把一个地区列表按照省份分类,可以根据身份获取省份下面城市的列表。下面是传统的方法:

private static Map<String, List<String>> normalSort(List<Area> areaList) {
Map<String, List<String>> resultMap = new HashMap<String, List<String>>();
for (Area area : areaList) {
if (resultMap.get(area.getProvince()) == null) {
List<String> list = new ArrayList<String>();
list.add(area.getCity());
resultMap.put(area.getProvince(), list);
} else {
resultMap.get(area.getProvince()).add(area.getCity());
}
}
return resultMap;
}

接下去是multiMap实现方式,看上去简洁美观了好多:

private static Multimap<String, String> multiMapSort(List<Area> areaList) {
Multimap<String, String> multiMap = ArrayListMultimap.create();
for (Area area : areaList) {
multiMap.put(area.getProvince(), area.getCity());
}
return multiMap;
}

有人会有疑问Map的Key不是唯一的嘛,同一个key放入不同的值,岂不是会被最后放入的值覆盖?其实不然,这也正是Multimap的好处之一:一键多值
写个main方法测试一下:

public static void main(String[] args) {
List<Area> areaList = creatAreaList();
System.out.println(normalSort(areaList).get("浙江").toString());
System.out.println(multiMapSort(areaList).get("浙江").toString());
}

结果如下:
guava新集合类型——Multimap

结果两种方式都能返回,那么哪一种性能更好呢?
经测试,当数据量到达10万级别时,两者速度开始相当,数据量越小,老的方式越快。
所以如果是追求简约美观的代码,同时又想很方便的处理复杂的数据结构,可以用Multimap;
但是如果对于性能有特别要求的,建议还是用传统的方式。