博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Guava Collections API学习之Multimap
阅读量:4151 次
发布时间:2019-05-25

本文共 3332 字,大约阅读时间需要 11 分钟。

 

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

 

@Testpublic void test1(){		List
personList = new ArrayList
(); 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
personList){ Optional
> optionalForPerson= Optional.fromNullable(personList); if (!optionalForPerson.isPresent()) { return; } Map
> map = new HashMap
>(); for (Person person : personList) { String sex = person.getSex(); List
persons = map.get(sex); if (null == persons) {//第一次加入 persons = new ArrayList
(); } persons.add(person); map.put(sex, persons); } for(Entry
> 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提供了下面的结构

 

import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap;  Multimap
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
myMultimap = ArrayListMultimap.create(); for (Person person : personList) { String sex = person.getSex(); myMultimap.put(sex, person); } Map
> map1 = myMultimap.asMap(); for (Entry
> entry : map1.entrySet()) { String key = entry.getKey(); System.out.println(key + "\t" + entry.getValue()); }

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

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

 

转载地址:http://nplti.baihongyu.com/

你可能感兴趣的文章
HTML5学习之——HTML 5 Canvas vs. SVG
查看>>
HTML5学习之——HTML 5 应用程序缓存
查看>>
HTML5学习之——HTML 5 Web Workers
查看>>
HTML5学习之——HTML 5 Canvas
查看>>
HTML5学习之——HTML5 内联 SVG
查看>>
HTML5学习之——HTML 5 服务器发送事件
查看>>
SVG学习之——HTML 页面中的 SVG
查看>>
SVG 形状学习之——SVG 矩形<rect>
查看>>
SVG 形状学习之——SVG圆形
查看>>
SVG 滤镜学习之——SVG 滤镜
查看>>
mysql中用命令行复制表结构的方法
查看>>
hbase shell出现ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException
查看>>
让代码变得更优雅-Lombok
查看>>
解决Rhythmbox乱码
查看>>
豆瓣爱问共享资料插件发布啦
查看>>
Ubuntu10.10 CAJView安装 读取nh\kdh\caj文件 成功
查看>>
kermit的安装和配置
查看>>
vim 配置
查看>>
openocd zylin
查看>>
进程创建时文件系统处理
查看>>