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

    @Test  public void test1(){  List<Person> personList = new ArrayList<Person>();  Person person = new Person("孙刚1", "21", "男");  Person person2 = new Person("孙刚2", "21", "男");  Person person3 = new Person("孙刚3", "21", "女");  Person person4 = new Person("孙刚4", "21", "男");  Person person5 = new Person("孙刚5", "21", "女");  Person person6 = new Person("孙刚6", "21", "男");  personList.add(person);  personList.add(person2);  personList.add(person3);  personList.add(person4);  personList.add(person5);  personList.add(person6);  genderStatistics(personList);  }  //性别统计    public void genderStatistics(List<Person> personList){  Optional<List<Person>> optionalForPerson= Optional.fromNullable(personList);  if (!optionalForPerson.isPresent()) {  return;  }  Map<String, List<Person>> map = new HashMap<String, List<Person>>();  for (Person person : personList) {  String sex = person.getSex();  List<Person> persons = map.get(sex);  if (null == persons) {//第一次加入  persons = new ArrayList<Person>();  }  persons.add(person);  map.put(sex, persons);  }  for(Entry<String, List<Person>> entry : map.entrySet()){  String key = entry.getKey();  System.out.println(key + ":" + entry.getValue());    }  }  

结果如下:

    女:[Person [name=孙刚3, age=21, sex=女], Person [name=孙刚5, age=21, sex=女]]  男:[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提供了下面的结构

mport com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;    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实现上面同样的功能代码有点像

    Multimap<String, Person> myMultimap = ArrayListMultimap.create();   for (Person person : personList) {    String sex = person.getSex();    myMultimap.put(sex, person);    }    Map<String, Collection<Person>> map1 = myMultimap.asMap();    for (Entry<String, Collection<Person>> entry : map1.entrySet()) {    String key = entry.getKey();    System.out.println(key + "\t" + entry.getValue());    }    

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

    ListMutlimap<String,Person> myMutlimap = ArrayListMultimap.create();    // Returns a List, not a Collection.    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的数量。

转载于:https://www.cnblogs.com/sungang/p/3641200.html

Guava API学习之Multimap相关推荐

  1. guava API整理

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

  2. Guava库学习:学习Concurrency(九)RateLimiter

    2019独角兽企业重金招聘Python工程师标准>>> 链接地址:http://www.xx566.com/detail/164.html 上一篇,Guava库学习:学习Concur ...

  3. Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例

    2019独角兽企业重金招聘Python工程师标准>>> 原文地址:Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例 上一篇Guava库学习:学习 ...

  4. Crypto API 学习笔记一

    标 题: [原创]Crypto API 学习笔记一 作 者: jdxyw 时 间: 2006-09-01,16:47 链 接: http://bbs.pediy.com/showthread.php? ...

  5. IOS 14.5版本之解档和归档的API学习

    IOS 14.5版本之解档和归档的API学习 第一部分 回顾一下老api的使用,将对象持久化至硬盘里面. 1.为什么我们要学习解档和归档, 有什么作用.当 plist 文件存储无法满足我们的需求的时候 ...

  6. libvirt API学习笔记

    为环境CentOS5.5 从官方网站上下载了文档   libvirt 0.7.5  Application  Development Guide 由于CentOS自带libvirt版本为0.6.3的, ...

  7. Netty 学习之旅:ByteBuf 篇之 ByteBuf 内部结构与 API 学习

    1.原生 ByteBuffer.ByteBuf 内部结构设计 首先我们来回顾一下 java.nio.ByteBuffe r的内部结构设计. ByteBuffer 内部持有一个 byte[] bt, 再 ...

  8. javascript:常用API学习Math.random, toString,slice(),substr(),Math.ceil()

    javascript:常用API学习 1.获得随机数:Math.random() 如何随机获得整数? 2.如何转进制:十进制转二进制?: 变量名.toString(进制数) 3. 36进制:能把一个小 ...

  9. 图形API学习工程(10):基础光照

    工程GIT地址:https://gitee.com/yaksue/yaksue-graphics 目标 在<图形API学习工程(6):创建并使用UniformBuffer>中,Unifor ...

最新文章

  1. 解决tomcat shutdown时的地址被占用问题
  2. 牛客网在线编程之“字符串分割”
  3. STM32工作笔记0029---认识电路原理图中的VCC,VDD,VEE,VSS
  4. Leetcode每日一题:204.count-primes(计数质数)
  5. 机器学习之使用sklearn构造决策树模型
  6. 对于Linux安装mysql5.7版本出现的问题
  7. 数据库中单个表数据备份
  8. struts2.xml中使用chain和redirectAction这两个类型结果(type-result)时,报检查错误(validation)...
  9. java qq音乐接口 api,GitHub - yan123zi/qqMusicApi: qq音乐Api接口
  10. 软件测试管理与组织结构
  11. Java 8 - 并行流计算入门
  12. 聚(N-异丙基丙烯酰胺)PNIPAM离子微凝胶-聚合物后分散形成的纳米粒子-瑞禧
  13. 二倍均值随机算法之抢拼手气红包场景应用
  14. windows10自带的画图软件橡皮擦调解大小
  15. Visual Studio大写小写转换切换快捷键
  16. 【GO MICRO V3】protoc-gen-micro 生成proto代码
  17. Flink Table API和SQL(下)
  18. 在Qt中使用SmtpClient发送邮件
  19. Electron 麒麟 Linux 系统 root 账户报错
  20. 一次鞭辟入里的 Log4j2 异步日志输出阻塞问题的定位

热门文章

  1. 使用keras时下载VGG19过慢的解决方法
  2. w7怎么查看电脑配置_学室内设计,对电脑配置有何要求?不懂戳这!
  3. 什么是android刷机包,什么是安卓RAM?安卓RAM和安卓ROM有什么区别?
  4. 网站推广专员浅析如何做好网站推广与运营?
  5. 企业选择网站建设能够对自身带来哪些作用?
  6. 模拟海_浙江平湖“海水稻”丰收的背后,有这家来自上海企业的科技“秘方”...
  7. 怎么使用7zip进行分批压缩_装机必备软件之压缩软件篇——7zip
  8. 吉大c 语言程序设计奥鹏作业,吉大19秋学期《C语言程序设计》在线作业一【满分答案】...
  9. windows 编写的硬件驱动_哪个是PXI硬件合适的设备驱动程序?VISA还是IVI?
  10. 猫和老鼠服务器维修有问题,猫和老鼠:游戏中大范围的断网掉线问题 玩家:土豆服务器就这样...