guava之multimap


上一篇说的是Multiset它可以对存入的相同元素做一个计数的功能,那multimap呢?

一、概述

1、基本介绍和案例说明

  multimap和Multiset的继承结果很相似,只不过在上层的接口是Multimap不是Multiset

Multimap的特点其实就是可以包含有几个重复key的value值,你可以put进多个不同的value,但是key相同,但是又不是让后面的覆盖前面的内容

它的业务场景:当你需要构造像Map<K,List<V>> 或者Map(K,Set<V>)这样比较复杂的集合类型的数据结构,来做相应的业务逻辑处理,那Multimap在合适不过

举例

public class MultimapTest {

    @Test
public void testMultimap(){
HashMultimap<Integer, Integer> map = HashMultimap.create();
map.put(1, 2);
map.put(1, 3);
map.put(1, 2);
map.put(2, 3);
map.put(4, 2);
map.put(4, 3);
map.put(4, 2);
map.put(4, 3);
System.out.println(map.toString());
}
}
/*输出结果:
*{1=[2, 3], 2=[3], 4=[2, 3]}
*/
 

其实它会把相同的key和value的值会覆盖起来,但是相同的key又可以保留不同的value,因为它的entry的实现是一个Set,Set会对相同的Entry<K,V>进行曲重,所以会有这种情况

那map和multimap又有什么区别呢?

Map是不能有重复的键值,就像在我们国家一个男人只能有一个老婆,男人就是KEY,老婆就是VALUE.
Multimap是可以有重复的键值,就像一个男人可以有多个情人。

2、实际开发场景及常用方法

  (1)根据业务需要对下面的list数据根据name字段进行分组

[
{
"date":"2018-01-31",
"name":"wuzhong",
"socre":0.8
},
{
"date":"2018-01-30",
"name":"wuzhong",
"socre":0.9
},
{
"date":"2018-01-31",
"name":"wuzhong2",
"socre":0.8
}
]

传统做法:

   Map<String,List<Item>> map = new HashMap<>();
for (Item item : list){
List<Item> tmp = map.get(item.getName());
if (null == tmp){
tmp = new ArrayList<>();
map.put(item.getName(),tmp);
}
tmp.add(item);
}

很简单,但是代码量有点多,特别是需要判断List为null并初始化

再用guava实现上述的功能

  //使用Multimap做法
Multimap<String,Item> multiMap = ArrayListMultimap.create();
for (Item item : list){
multiMap.put(item.getName(),item);
}

代码量直接减少一半,这样实际开发中才能发挥作用

  (2)再举一例子了解常用方法

public class MultimapTest01 {

    public static void main(String args[]){

        Multimap<String,String> multimap = ArrayListMultimap.create();

        multimap.put("lower", "a");
multimap.put("lower", "b");
multimap.put("lower", "c"); multimap.put("upper", "A");
multimap.put("upper", "B"); List<String> lowerList = (List<String>)multimap.get("lower");
//输出key为lower的list集合
System.out.println("输出key为lower的list集合=========");
System.out.println(lowerList.toString());
lowerList.add("f");
System.out.println(lowerList.toString()); Map<String, Collection<String>> map = multimap.asMap();
System.out.println("把Multimap转为一个map============");
for (Map.Entry<String, Collection<String>> entry : map.entrySet()) {
String key = entry.getKey();
Collection<String> value = multimap.get(key);
System.out.println(key + ":" + value);
} System.out.println("获得所有Multimap的key值==========");
Set<String> keys = multimap.keySet();
for(String key:keys){
System.out.println(key);
} System.out.println("输出Multimap所有的value值========");
Collection<String> values = multimap.values();
System.out.println(values);
}

输出结果:

4、Multimap的实现类

  Multimap提供了丰富的实现,所以你可以用它来替代程序里的Map<K, Collection<V>>,具体的实现如下:

  Implementation            Keys 的行为类似          Values的行为类似

  ArrayListMultimap         HashMap                     ArrayList

  HashMultimap               HashMap                     HashSet

  LinkedListMultimap        LinkedHashMap*              LinkedList*

  LinkedHashMultimap      LinkedHashMap                LinkedHashSet

  TreeMultimap                TreeMap                          TreeSet

  ImmutableListMultimap  ImmutableMap                 ImmutableList

  ImmutableSetMultimap  ImmutableMap                 ImmutableSet  

  以上这些实现,除了immutable的实现都支持null的键和值。

  1、LinkedListMultimap.entries()能维持迭代时的顺序。

  2、LinkedHashMultimap维持插入的顺序,以及键的插入顺序。

java代码(6) ---guava之multimap的更多相关文章

  1. java代码之美(6)---guava之multimap

    guava之multimap 上一篇讲到Multiset它可以对存入相同元素做一个计数的功能,那multimap呢? 一.概述 1.基本介绍和案例说明 multimap和MultiSet的继承结果很相 ...

  2. 使用 Google Guava 美化你的 Java 代码

    文章转载自:http://my.oschina.net/leejun2005/blog/172328 目录:[ - ] 1-使用 GOOGLE COLLECTIONS,GUAVA,STATIC IMP ...

  3. java代码之美(4)---guava之Immutable(不可变)集合

    Immutable(不可变)集合 一.概述 guava是google的一个库,弥补了java语言的很多方面的不足,很多在java8中已有实现,暂时不展开.Collections是jdk提供的一个工具类 ...

  4. java代码之美(3)---guava 复写Object常用方法

    guava 复写Object常用方法 Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,这个库提供用于集合,缓存,支持原语,并发性,常见注解,字符串处理,I/O和验证的实用方 ...

  5. 使用 Google Guava 美化你的 Java 代码:1~4 【转】

    文章转载自:http://my.oschina.net/leejun2005/blog/172328 1.使用Google Collections,Guava,static imports编写漂亮代码 ...

  6. java代码(3)----guava复写Object常用方法

    guava复写Object常用方法 Guava是一个Google的基于java1.6的类库集合的扩展项目,这个库提供用于集合,缓存,支持原语,并发性,字符串处理,I/O和验证的实用方法, 这些高质量的 ...

  7. Linkedin工程师是如何优化他们的Java代码的(转)

    英文原文:LinkedIn Feed: Faster with Less JVM Garbage 最近在刷各大公司的技术博客的时候,我在Linkedin的技术博客上面发现了一篇很不错博文.这篇博文介绍 ...

  8. 像写C#一样编写java代码

    JDK8提供了非常多的便捷用法和语法糖,其编码效率几乎接近于C#开发,maven则是java目前为止最赞的jar包管理和build工具,这两部分内容都不算多,就合并到一起了. 愿编写java代码的过程 ...

  9. java代码之美(11)---java代码的优化

    java代码的优化 随着自己做开发时间的增长,越来越理解雷布斯说的: 敲代码要像写诗一样美.也能理解有一次面试官问我你对代码有洁癖吗? 一段好的代码会让人看就像诗一样,也像一个干净房间会让人看去很舒服 ...

随机推荐

  1. Mysql 常用函数(11)- trim 函数

    Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html trim 的作用 删除字符串左右两侧的空格 tri ...

  2. 【clear linux】intel clear linux 电源状态命令

    # 重启系统 $ sudo systemctl reboot # 关闭系统,切断电源 $ sudo systemctl poweroff # CPU停止工作 $ sudo systemctl halt ...

  3. RobotFramework Selenium2Library 关键字详解

    *** Settings *** Library Selenium2Library *** Keywords *** Checkbox应该不被选择 [Arguments] ${locator} Che ...

  4. 【Python代码】混合整数规划MIP/线性规划LP+python(ortool库)实现

    目录 相关知识点 LP线性规划问题 MIP混合整数规划 MIP的Python实现(Ortool库) assert MIP的Python实现(docplex库) 相关知识点 LP线性规划问题 Linea ...

  5. Angular路由知识点

    路由跳转 1. 模板方式:<ANY  routerLink='/ucenter'></ANY> 2. 脚本方式:  constructor(private router:Rou ...

  6. mpvue从一无所有开始仿大众点评小程序

    最近尝试了下用mpvue框架开发小程序,它是基于vue开发的. 官方介绍: mpvue 是一个使用 Vue.js 开发小程序的前端框架.框架基于 Vue.js 核心,mpvue 修改了 Vue.js ...

  7. poj3694 连通无向图图加边后有多少桥

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 10261   Accepted: 3807 Descript ...

  8. Gym101612L Little Difference

    题目链接:https://vjudge.net/problem/Gym-101612L 知识点: 数学 题目大意: 给一个数 \(n(1 \le n \le 10^{18})\),要求将 \(n\) ...

  9. Vue基础:子组件抽取与父子组件通信

    在工作中承担一部分前端工作,主要使用Vue + Element UI. 随着版本迭代,需求增加,页面往往变得更加臃肿,不易维护.学习子组件的封装和抽取,能更好适应需求. 为什么需要子组件 可复用 将重 ...

  10. Pyqt5_QWidget

    QWidget常用方法: Qwidget.size()#获得客户区的大小 QWidget.width().QWidget.height()#获得客户区的宽度与高度 #设置不可以变宽.高 QWidget ...