相信大家对Java中的Map类及其之类有大致的了解,Map类是以键值对的形式来存储元素(Key->Value),但是熟悉Map的人都知 道,Map中存储的Key是唯一的。什么意思呢?就是假如我们有两个key相同,但value不同的元素需要插入到map中去,那么先前的key对应的 value将会被后来的值替换掉。如果我们需要用Map来把相同key的值存在一起,代码看起来像下面一样:

  1. @Test
  2. public void test1(){
  3. List<Person> personList = new ArrayList<Person>();
  4. Person person = new Person("孙刚1", "21", "男");
  5. Person person2 = new Person("孙刚2", "21", "男");
  6. Person person3 = new Person("孙刚3", "21", "女");
  7. Person person4 = new Person("孙刚4", "21", "男");
  8. Person person5 = new Person("孙刚5", "21", "女");
  9. Person person6 = new Person("孙刚6", "21", "男");
  10.  
  11. personList.add(person);
  12. personList.add(person2);
  13. personList.add(person3);
  14. personList.add(person4);
  15. personList.add(person5);
  16. personList.add(person6);
  17.  
  18. genderStatistics(personList);
  19. }
  20.  
  21. //性别统计
  22. public void genderStatistics(List<Person> personList){
  23. Optional<List<Person>> optionalForPerson= Optional.fromNullable(personList);
  24. if (!optionalForPerson.isPresent()) {
  25. return;
  26. }
  27.  
  28. Map<String, List<Person>> map = new HashMap<String, List<Person>>();
  29. for (Person person : personList) {
  30. String sex = person.getSex();
  31. List<Person> persons = map.get(sex);
  32. if (null == persons) {//第一次加入
  33. persons = new ArrayList<Person>();
  34. }
  35.  
  36. persons.add(person);
  37. map.put(sex, persons);
  38. }
  39.  
  40. for(Entry<String, List<Person>> entry : map.entrySet()){
  41. String key = entry.getKey();
  42. System.out.println(key + ":" + entry.getValue());
  43. }
  44. }

结果如下:

  1. 女:[Person [name=孙刚3, age=21, sex=女], Person [name=孙刚5, age=21, sex=女]]
  2. 男:[Person [name=孙刚1, age=21, sex=男], Person [name=孙刚2, age=21, sex=男], Person [name=孙刚4, age=21, sex=男], Person [name=孙刚6, age=21, sex=男]]

虽然实现了功能,但是代码比较长,但是如果你用Guava去实现同样的功能,你会发现你的代码一下子变少了。Guava提供了下面的结构

  1. mport com.google.common.collect.ArrayListMultimap;
  2. import com.google.common.collect.Multimap;
  3.  
  4. Multimap<K, V> myMultimap = ArrayListMultimap.create();

从名字可以看出,Multimap可以存放的key值是不唯一的,Multimap并没有实现 Map 的接口,所以不需要达到键唯一的要求。如果存放了key一样的元素,Multimap并不会覆盖以前相同的key元素,而是加进去了。结果有点像{k1= [v1, v2, v3], k2=[v7, v8],….}其中v1, v2, v3对应的key都是k1,而如果是Map,则它的结果有点像{k1=v1, k2=v2,…}看到区别了吧?那么,用Multimap实现上面同样的功能代码有点像

  1. Multimap<String, Person> myMultimap = ArrayListMultimap.create();
  2. for (Person person : personList) {
  3. String sex = person.getSex();
  4. myMultimap.put(sex, person);
  5. }
  6.  
  7. Map<String, Collection<Person>> map1 = myMultimap.asMap();
  8. for (Entry<String, Collection<Person>> entry : map1.entrySet()) {
  9. String key = entry.getKey();
  10. System.out.println(key + "\t" + entry.getValue());
  11. }

看到了吧,代码简单多了吧!这里有一点你可能会疑惑,就是为何get方法返回的是一个Collection而不是list,这是因为前者会更加有用。如果 你需要基于multimap直接操作list或者set,那么可以在定义类型的时候使用子类名称:ListMultimap,SetMultimap和 SortedSetMultimap。例如:

  1. ListMutlimap<String,Person> myMutlimap = ArrayListMultimap.create();
  2. // Returns a List, not a Collection.
  3. List<Person> myValues = myMutlimap.get("myKey");

这里需要再次强调的是,Multimap不是Map(Multimap Is Not A Map)!

一 个Multimap<K, V>不是一个Map<K, Collection<V>>, 虽然我们可以利用Map<K, Collection<V>>来实现Multimap<K, V>,即使如此,它们之间还是有区别的:

  1. Multimap.get(key) 总是返回一个unll值(可能是一个空的collection);
  2. 可 以利用asMap()方法来得到一个 Map<K, Collection<V>>类型的数据(或者利用ListMultimap中的静态方法Multimaps.asMap()得到一个 Map<K, List<V>类型的数据; SetMultimap和SortedSetMultimap也类似);
  3. Multimap.containsKey(key)只有在这个key和一个或者多个元素相关联的时候才会返回true,如果这个key在删除之前和一个或者多个元素相关联则函数将会返回false;
  4. Multimap.entries()返回Multimap所有实体的所有key值;
  5. Multimap.size()返回在Multimap中存放的所有实体的数量,而不是不同keys的数量。我们可以利用Multimap.keySet().size()得到Multimap中所有不同keys的数量。

Guava API学习之Multimap的更多相关文章

  1. Guava API学习之Preconditions优雅的检验参数 编辑

    在日常开发中,我们经常会对方法的输入参数做一些数据格式上的验证,以便保证方法能够按照正常流程执行下去.对于可预知的一些数据上的错误,我们一定要做 事前检测和判断,来避免程序流程出错,而不是完全通过错误 ...

  2. Guava API学习之Ordering犀利的比较器 编辑

    Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强.它非常容易扩展,可以轻松构造复杂的comparator,然后用在 ...

  3. Guava API学习之Optional 判断对象是否为null

    java.lang.NullPointerException,只要敢自称Java程序员,那对这个异常就再熟悉不过了.为了防止抛出这个异常,我们经常会写出这样的代码: Person person = p ...

  4. [置顶] Guava学习之Multimap

    相信大家对Java中的Map类及其之类有大致的了解,Map类是以键值对的形式来存储元素(Key->Value),但是熟悉Map的人都知道,Map中存储的Key是唯一的.什么意思呢?就是假如我们有 ...

  5. guava API整理

    1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection API Guava Basic Utilities IO API C ...

  6. Openstack api 学习文档 & restclient使用文档

    Openstack api 学习文档 & restclient使用文档 转载请注明http://www.cnblogs.com/juandx/p/4943409.html 这篇文档总结一下我初 ...

  7. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  8. Openstack python api 学习文档 api创建虚拟机

    Openstack python api 学习文档 转载请注明http://www.cnblogs.com/juandx/p/4953191.html 因为需要学习使用api接口调用openstack ...

  9. Windows录音API学习笔记(转)

    源:Windows录音API学习笔记 Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { W ...

随机推荐

  1. OSTaskCreateExt() 建立任务

    OSTaskCreateExt()建立任务 NT8U OSTaskCreateExt (void   (*task)(void *pd), void    *pdata, OS_STK *ptos, ...

  2. WCF入门教程[WCF基本应用]

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

  3. iOS开发工具——统计Crash的工具Crashlytics-备用

    简介 Crashlytic 成立于2011年,是专门为移动应用开者发提供的保存和分析应用崩溃信息的工具.Crashlytics的使用者包括:支付工具Paypal, 点评应用Yelp, 照片分享应用Pa ...

  4. weblogic使用脚本部署

    --本机 (/common/bin/wlst.sh (2)connect('weblogic','weblogic1','t3://localhost:7001') (3)progress=deplo ...

  5. CentOS 6.5 + Nginx 1.8.0 + PHP 5.6(with PHP-FPM) 负载均衡源码安装 之 (四)问题汇总

    关于外网无法访问虚拟机centos的问题 此一般由于centos默认防火墙配置,导致外部不允许访问80端口(或其他如9000端口).解决方法如下: 1.加入80端口的防火墙规则 /sbin/iptab ...

  6. ural 1640 Circle of Winter

    这道题真的很无聊,就是找一个圆,至少有一个点在这个圆上,其他点不能在圆外,半径不定: #include <cstdio> #include <cstring> #include ...

  7. JavsScript中的Document对象

    Document对象的属性 alinkColor,linkColor,vlinkColor:这些属性描述了超链接的颜色.linkColor指未访问过的链接的正常颜色,vlinkColor指访问过的链接 ...

  8. Xamarin Add Mac

    右键IOS项目,设置为启动项目,点击启动(F5)弹出如下提示 提示开启远程访问权限,按照提示照做即可 在mac端 进入系统偏好设置 双击选择共享 打开远程登陆,允许所有用户访问 设置完成后点击ok 弹 ...

  9. Powershell调用静态方法

    Powershell将信息存储在对象中,每个对象都会有一个具体的类型,简单的文本会以System.String类型存储,日期会以System.DateTime类型存储.任何.NET对象都可以通过Get ...

  10. YII 事件event和行为Behavior

    To declare an event in your CComponent child class, you should add a method with aname starting with ...