guava新集合类型——Multimap

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

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

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

private static Multimap multiMapSort(List areaList) {
    Multimap 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 areaList = creatAreaList();
    System.out.println(normalSort(areaList).get("浙江").toString());
    System.out.println(multiMapSort(areaList).get("浙江").toString());
}

结果如下:
这里写图片描述

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

转载于:https://my.oschina.net/u/2250363/blog/666857

你可能感兴趣的:(数据结构与算法)