Guava 之 Multimap

2023-11-16

Multimap 是 guava 包下的一个接口,是一个 (key, collection) 类型的集合.

Multimap 接口方法:

@GwtCompatible
public interface Multimap<K, V> {
  //返回Multimap集合的key、value pair的数量  
  int size();
  //判断Multimap是否包含key、value pair
  boolean isEmpty();
  //判断Multimap中是否包含指定key的value值
  boolean containsKey(@Nullable Object key);
  //判断Multimap中是否包含指定value的key
  boolean containsValue(@Nullable Object value);
  //判断Multimap中是否包含指定的key-value pair的数据
  boolean containsEntry(@Nullable Object key, @Nullable Object value);
  //将数据加入到Multimap中
  boolean put(@Nullable K key, @Nullable V value);
  //删除Multimap中指定key-value pair
  boolean remove(@Nullable Object key, @Nullable Object value);
  //将指定的key-集合数据加入Multimap中
  boolean putAll(@Nullable K key, Iterable<? extends V> values);
  //将指定的Multimap和当前的Multimap合并
  boolean putAll(Multimap<? extends K, ? extends V> multimap);
  //替换指定key的value
  Collection<V> replaceValues(@Nullable K key, Iterable<? extends V> values);
  //删除Imultimap中的指定key数据
  Collection<V> removeAll(@Nullable Object key);
  //清空Imultimap中的数据
  void clear();
  //获取指定key的值
  Collection<V> get(@Nullable K key);
  //获取所有的key集合
  Set<K> keySet();

  Multiset<K> keys();

  Collection<V> values();

  Collection<Map.Entry<K, V>> entries();

  Map<K, Collection<V>> asMap();
}

场景:有一批学生名单,需要按学生姓名进行分类。

使用 HashMap 实现:


        List<Student> studentList = createStudentList();
        Map<String, List<Student>> studentNameMap = new HashMap<>();

        for (Student student : studentList) {
            List<Student> students = studentNameMap.get(student.getName());
            if (students == null) {
                students = new ArrayList<>();
                studentNameMap.put(student.getName(), students);
            }

            students.add(student);
        }

使用 lambda 表达式优化代码:

        List<Student> studentList = createStudentList();
        Map<String, List<Student>> studentNameMap = new HashMap<>();

        for (Student student : studentList) {
            List<Student> students = studentNameMap.computeIfAbsent(student.getName(), k -> new ArrayList<>());
            students.add(student);
        }

需要判断List为null并初始化。

 

使用 Multimap 实现:

        //获取一个 key 为 String, value 为 List 的 Multimap实例
        Multimap<String, Student> multiMap = ArrayListMultimap.create();
        List<Student> studentList = createStudentList();

        //初始化 multimap
        studentList.forEach(student -> multiMap.put(student.getName(), student));

 

Multimap.get(key) 并不会返回一个 null 对象,如果该 key 不存在返回的是一个空的集合,所以在使用过程中注意,不能用 null 来判断 key 是否出现在multimap中。

 

Multimap 实现类:

实现类 key的行为 value的行为
ArrayListMultimap HashMap ArrayList
HashMultimap HashMap HashSet
LinkedListMultimap LinkedHashMap LinkedList
LinkedHashMultimap LinkedHashMap LinkedHashMap
TreeMultimap TreeMap TreeSet
ImmutableListMultimap ImmutableMap ImmutableList
ImmutableSetMultimap ImmutableMap ImmutableSet

 

 

 

 

 

 

 

 

 

根据不同业务需求,选择不同的实现类。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Guava 之 Multimap 的相关文章

随机推荐

  • html 视差效果,html5网页3D视差效果代码

    特效描述 html5网页 3D视差效果 html5网页3D视差效果代码 代码结构 1 引入CSS 2 引入JS 3 HTML代码 var ww wh function init t 0 ww window innerWidth wh win
  • win+r,cmd快捷操作合集

    1 appwiz cpl 程序和功能 2 calc 启动计算器 5 chkdsk exe Chkdsk磁盘检查 管理员身份运行命令提示符 6 cleanmgr 打开磁盘清理工具 9 cmd exe CMD命令提示符 10 自动关机命令 Sh
  • MySQL事务、日志、锁和MVCC机制

    InnoDB中事务的四大特性 原子性 当前事务的操作要么全部成功要么全部失败 原理 原子性是由undo log来保证的 undolog记录着数据修改之前的值 比如我们insert一条语句 undolog就会记录一条delete语句 我们up
  • 升级到 Ubuntu 18.04 LTS 的理由,大波新特性到来

    随着 2018 年 4 月 24 日稳定版正式发布日期的临近 也是时候来仔细研究下 Canonical 最新 Linux 发行版 Ubuntu 18 04 LTS Bionic Beaver 的最新功能特性了 LTS 版本每两年发布一次 而
  • Flutter Android 混合开发之使用 FlutterBoost 4.0

    搜了下全网 FlutterBoost教程大都还是老版本 所有有了这篇 当前使用环境 FlutterBoost 4 2 1 Flutter 3 3 4 首先根据官方文章集成 FlutterBoost FlutterBoost 集成详细步骤 接
  • Ftrace使用及实现机制

    Ftrace使用及实现机制 版权声明 本文为本文为博主原创文章 转载请注明出处 https www cnblogs com wsg1100 如有错误 欢迎指正 文章目录 Ftrace使用及实现机制 一 使用ftrace 1 挂载 2 关键文
  • vscode中如何拉取git代码_工具

    在一个目录下clone项目 git clone XXXXXX git 使用VScode 打开项目 右击通过Code打开 使用vscode提交代码 1 打开下面视图 添加一行文字 测试提交 2 点击 相当于git add
  • 大数据学习路线

    希望可以把这篇文章推广给所有想学习或者想从事数据科学方向的朋友 我作为偏统计方向的分析师也在这里说一下自己的一些学习方向和方法 希望对大家有帮助 推荐一个大数据学习群 142973723每天晚上20 10都有一节 免费的 大数据直播课程 专
  • 【JAVA】正则表达式是啥?

    个人主页 个人主页 系列专栏 初识JAVA 文章目录 前言 正则表达式 正则表达式语法 正则表达式的特点 捕获组 实例 前言 如果我们想要判断给定的字符串是否符合正则表达式的过滤逻辑 称作 匹配 可以通过正则表达式 从字符串中获取我们想要的
  • 深度学习在计算机视觉领域(图像,视频,3-D点云,深度图)的应用一览 计算机视觉图像处理

    先说图像 视频处理 计算机视觉的底层 不低级 图像处理 还有视频处理 曾经是很多工业产品的基础 现在电视 手机还有相机 摄像头等等都离不开 是技术慢慢成熟了 传统方法 经验变得比较重要 而且芯片集成度越来越高 基本上再去研究的人就少了 经典
  • 1024 CodeGenerator

    答 水一下 CodeGenerator package com example springtest author LeCodeYang version 1 0 description TODO date 2022 7 11 15 22 i
  • Spring集成log4j,日志初始化过程详解

    以前研究过slf4j log4j的使用 但具体初始化过程不是很清楚 今天闲下来 翻了一下源码 一探究竟 日志组件介绍 url http www blogjava net daiyongzhi archive 2014 04 13 41236
  • Shell脚本定时清理Postgres数据库中历史数据

    Shell脚本定时清理Postgres数据库中历史数据 在系统日常运行中 会产生大量的日志 日志表会越来越加庞大 特别是对于云服务器使用者来说 每一块的空间都是很宝贵的 所以定时清理掉无用的历史日志 就显得很有意义了 其实实现数据库的日志清
  • 类的继承层次结构的宽度和深度

    最近在项目开发中 各位兄弟对于现有的架构有所诟病 主要是继承的问题 层次比较深 层次之间没有很明确的功能划分 造成一定的混乱 我来承担工作 想出一套新的方案 满足大家平时开发的需求 先总结下现在项目的问题 一个是层次深 一个是抽象的不好 大
  • linux16.04 从零开始搭建maskrcnn (!!亲测有效!!)

    文章参考 https github com pytorch vision blob temp tutorial tutorials torchvision finetuning instance segmentation ipynb 环境搭
  • STL源码分析:空间配置器浅析

    目录 allocator alloc 一级配置器 二级配置器 自由链表 内存分配allocate S refill函数 S chunk alloc函数 内存释放deallocate 为什么要使用free list 为什么free list要
  • Java-spring数据库编程(idea)实现学生账号登录以及管理员增删改查功能

    通过所学的Spring数据库编程知识 实现学生管理系统的登录及增删改查的功能 要求学生在控制台输入用户名密码 如果用户账号密码正确则显示登录成功 如果登录失败则显示登录失败 登录成功后 可以进行增删改的功能 思路分析 根据学生管理系统及其登
  • 【数据结构详细学习笔记2】单链表的定义和表示

    目录 1 单链表基础知识 1 1线性表链式存储结构的特点 1 2 与链式存储有关的术语 1 3链表的类型 1 4表示空表 1 5设置头结点的好处 2 单链表代码实现 附源码 3 实现单链表遇到问题 1 单链表基础知识 1 1线性表链式存储结
  • matlab 算法集锦

    算法集锦 决策树 划分点 function n h huafendian1 x n返回增益 h返回划分点 假设0代表第一类 假设1代表第二类 输入x第一列为属性 第二列为用于学习的分类结果 m sort x 1 按小到大排序 x x m t
  • Guava 之 Multimap

    Multimap 是 guava 包下的一个接口 是一个 key collection 类型的集合 Multimap 接口方法 GwtCompatible public interface Multimap