还在使用集合类完成这些功能?不妨来看看 Guava 集合类!!!
日常开发中,小黑哥经常需要用到 Java 提供集合类完成各种需求。Java 集合类虽然非常强大实用,但是提供功能还是有点薄弱。
举个例子,小黑哥最近接到一个需求,从输入一个文档中,统计一个关键词出现的次数。代码如下:

虽然这个需求使用 Map 可以轻松搞定,但是小黑哥还是觉得这种写法有点笨拙,如果没有判空,将会导致 NPE 异常。
如果很多地方需要功能,我们就可以抽象出来,将其封装成工具类。
不过上面的功能大家就不需要自己封装,一款来自 Google 开源工具类-Guava,可以轻松的解决上面的统计问题。
Guava 介绍
Guava 是一款 Google 开源工具类,包含许多 Google 内部 Java 项目依赖的核心类。Guava 扩展 Java 基础类工程,比如集合,并发等,也增加一些其他强大功能,比如缓存,限流等功能。
另外 Guava 推出一些类,如 Optional,甚至被 Java 开发者学习,后续增加到 JDK 中。
目前 Guava Github 仓库已有 36k star,可以见到 Guava 受欢迎程度。

Guava 核心功能包括多个模块,今天小黑哥主要带大家玩转 Guava 集合类。
扩展集合类
Guava 创造很多 JDK 没有,但是我们日常却明显有用的新集合类型。这些新类型使用 JDK 集合接口规范,所以使用方法与 JDK 集合框架差不多,并没有增加很多使用难度。
Multiset
小黑哥第一次见到 Multiset 这个类,还以为是 Set 接口子类。实际上此『Set』,仅仅只是数学上集合概念。
Multiset 继承 JDK Collection 接口,我们可以多次增加相同的元素,另外 Multiset 最大特定将会为元素计数,我们可以将它类似等同为 Map<E, Integer> 。
使用 Multiset可以轻松解决开头的问题。

使用 Multiset 简化了代码,并且再也不用担心新 NPE 的问题。
跟 JDK 集合类一样,Multiset也有许多子类。

这里小黑哥提醒一下大家,虽然上面说过我们可以将 Multiset<E> 看做 Map<E, Integer>,但是 Multiset 可不是 Map 的子类,它可是 血统纯正的 Collection 子类。
Multimap
小黑哥有时会在业务需求中使用 Map<String,List<Integer> 实现下面的需求。
a->[1,2,3] b->4,c->[6,5]
使用 Map + List 这种结构比较笨拙,并且代码实现也比较繁琐。Multimap 正式 Guava 中解决这种问题的新出的一个雷。
使用 Multimap 实现代码如下:

这里小黑哥使用 Multimap 子类 HashMultimap,其行为类似为 Map<K,Set<V>>,也就是说 Value 对应的集合内部元素不能重复。如果需要保存的重复的元素我们可以使用 ArrayListMultimap。
Multimap还有其他子类,如图所示:

BiMap
BiMap 可以用来实现键值对的双向映射需求,这样我们就可以通过 Key 查找对对应的 Value,也可以使用 Value 查找对应的 Key。
这个需求如果使用 Map 实现,我们就不得不使用两个 Map,维护双向关系,并且任何改动还要保持同步。

使用 BiMap 修改上面的代码:

这里需要注意,BiMap#put方法不能加入重复元素, 若加入,将会抛错。如果若特定值一定要替换,可以使用 BiMap#forcePut代替。
敲黑板,这个知识点记下来。小黑哥使用过程中,就踩过这个坑。
同样的 BiMap 也有各种实现类:

其他扩展集合类
Guava 另外还提供其他集合类,不过这些类使用起来有点复杂,小黑哥还未在业务代码中使用过,这里简单提下,感兴趣同学可以深入了解一下。
- Table
- ClassToInstanceMap
- RangeSet
- RangeMap
集合工具类
除了上面提到的新集合类以外,Guava 提供通用的工具类:

这些工具类需对使用的方法,我们可以快速创建集合,分割集合,转化集合等。
快速创建集合实例
使用工具类,我们可以快速创建集合。例如:
List<String> list=Lists.newArrayList();
Set<String> set=Sets.newHashSet();
Map<String,String> map=Maps.newHashMap();
相比于 new 集合方法,Guava 方法创建方式更加简单。
List<String> list=new ArrayList<String>();
Set<String> set=new HashSet<String>();
Map<String,String> map=new HashMap<String, String>();
Guava 工具类智能推导 List 泛型,再也不用两侧都重复写泛型了。
另外还可以指定集合类的初始化大小。

Lists.transform
Lists#transform方法可以替代繁琐 for 循环,将元素转化,创建一个新集合类。

不过使用这个方法我们要注意一点。
Lists#transform 内部使用懒加载的机制,只有在调用获取的元素的时候,如 result.get 才会真正使用 Function 从源 List 获取元素,做相应的转化。每次获取元素都将会使用 function 进行转化。
所以使用 Lists#transform 得到 List 仅仅只是源 List 一个视图,任何对源 List 的元素修改,都将会被反应到创建之后的 List 。任何对创建之后 List 中的元素进行修改,都不会生效。下次再次读取元素时,将会发现相应修改的丢失了。。。
小黑哥之前就踩过这个坑,如果你有这种需求,可以使用以下方式创建一个新集合:

JDK8 之前版本,小黑哥经常使用该方法转化
List中的元素。不过你如果使用 JDK8,小黑哥还是推荐使用 Stream 流式编程。
交集并集差集
Sets 提供几个方法,可以快速求出两个 Set 集合的交集,并集以及差集。

不可变集合
不可变(Immutable)集合,顾名思义集合不可以被修改。初始创建不可变集合时吗,需要传入数据源,创建完成之后,集合就再也不能修改,增加,删除元素,否则将会报错。
这是一种防御性策略,防止集合在后续操作中被修改,从而引发问题。
不可变集合优点在于:
- 由于不可变集合仅仅只能读,多线程并发天然安全
- 由于不可变集合固定不变,可以将其当做常量安全,不用单线其他人修改
- 不可变集合占用更少内存空间
- 不可变集合不可以被修改,所以不用担心其他程序任意修改集合
Guava 不可变集合支持 JDK 所有集合接口:

我们可以使用如下几种方式创建不可变集合,以 ImmutableList 为例:

List<String> fromList=Lists.newArrayList("点赞","关注");
// 从一个集合拷贝元素
ImmutableList.copyOf(fromList);
ImmutableList.of("关注","Java极客技术");
ImmutableList.builder().add("关注").addAll(fromList).build();
总结
这篇文章小黑哥带大家学习开源工具 Guava 集合的相关类使用方法,日常开发中我们善于使用这些工具类,不要自己重复造轮子。
本篇文章仅仅只是介绍 Guava 一小部分功能,还有很对功能,小黑哥也觉得很好用在。这里推荐大家去查看 Guava 官方 wiki,查看具体使用方法。
如果大家还想知道其他开源工具类,给小黑哥点个赞,下次给大家带来十分好用开源工具类~

欢迎关注我的公众号:程序通事,获得日常干货推送。如果您对我的专题内容感兴趣,也可以关注我的博客:studyidea.cn
还在使用集合类完成这些功能?不妨来看看 Guava 集合类!!!的更多相关文章
- Guava -- 集合类 和 Guava Cache
Guava -- 集合类 和 Guava Caches 1. 什么是 Guava Guava 是 google 推出的一个第三方 java 库,用来代替 jdk 的一些公共操作,给我印象特别深的就是 ...
- redis-cli中那些或许我们还不知道的一些实用小功能
玩过redis的朋友都知道,redis中有一个叫做redis-cli的小工具,我们可以利用它在test和develop环境下进行高效的模拟测试,然而在现实环境中, 我们只知道直接键入redis-cli ...
- 快来,Boom 3D广播功能还能这样用
Boom 3D不仅为用户提供了包括3D立体音效.古典音乐音效在内的多种音效增强功能,而且还为用户提供了广播功能.该广播功能不仅涵盖了国内广播节目,而且还涵盖了国际广播节目. Boom 3D的广播功能还 ...
- Java基础知识笔记(八:集合类)
目录 1 集合类简介 2 List介绍及简单使用 2.1 LinkedList介绍及简单使用 2.2 ArrayList介绍及简单使用 2.3 Vector介绍及简单使用 2.3.1 S ...
- Java集合类: Set、List、Map、Queue使用场景梳理
本文主要关注Java编程中涉及到的各种集合类,以及它们的使用场景 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E ...
- Java集合类: Set、List、Map、Queue使用
目录 1. Java集合类基本概念 2. Java集合类架构层次关系 3. Java集合类的应用场景代码 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的 ...
- 基础知识《六》---Java集合类: Set、List、Map、Queue使用场景梳理
本文转载自LittleHann 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E6%8E%92%E5%BA%8F% ...
- Java集合类从属关系
Java的集合分为了四类:List Set Queue Map,每类都有不同的实现,有基于数组实现的,有基于链表实现的,有基于xx树实现的,不同的实现虽在功能上可以相互替代但都有各自的应用场景,如基于 ...
- (4)java数据结构--集合类及其数据结构归纳-有大图
Java集合类及其数据结构归纳 - s小小的我 - 博客园http://www.cnblogs.com/shidejia/p/6433788.html ---------大图可以 在新标签中打开图片 ...
随机推荐
- python数据类型:列表List和Set
python数据类型:列表List, Set集合 序列是Python中最基本的数据结构 序列中每个元素都分配一个数字,表示索引 列表的数据项不需要具有相同的类型 列表中的值可以重复并且有 ...
- verilog求倒数-ROM实现方法
采用线性逼近法结合32段线性查找表的方式来实现1/z的计算. 首先将1/32-1/64的定点化数据存放到ROM中,ROM中存放的是扩大了2^20 次方的数字四舍五入后的整数部分.n值越大,精度越大,误 ...
- Django正向解析和反向解析
转载:https://blog.csdn.net/jeekmary/article/details/79673867 先创建一个视图界面 urls.py index.html index页面加载的效果 ...
- apache启动但是无法访问网页
apache启动但是访问不了的问题排除??? 端口没有被占用,则需要考虑防火墙问题. 首先我们需要确保远程的Linux系统已经安装好,我们使用xshell远程SSH登录到Linux系统里,同时我们也要 ...
- OpenSSL之X509系列
OpenSSL之X509系列之1---引言和X509概述 [引言] X509是系列的函数在我们开发与PKI相关的应用的时候我们都会用到,但是OpenSSL中对X509的描述并不是很多,鉴于些,我 ...
- Servlet.service() for servlet [appServlet] in context with path [/item] threw exception [Request processing failed
以前犯过的一个小错误,不过忘记怎么修改了,所以还是记录下来好一点 严重: Servlet.service() for servlet [appServlet] in context with path ...
- springboot ——oracle.jdbc.driver.OracleDriver
网上很多案例讲是oracle的驱动包没有导入进去,我之前尝试下图示方式导入解决该问题: 但是在后期调试的时候,发现会影响后续oracle数据源连接驱动的问题,导致不能查询,因此想,另辟途径,解决这个问 ...
- 4K手机能拯救索尼手机吗?
智能手机屏幕分辨率究竟达到多少才是极限,一直是业内争论不休的问题.从低分辨率一路走来,直到iPhone 4搭载视网膜屏,业内才有了一个较为统一的认知:屏幕起码要在合适距离下看不到文字.图像虚影,才称得 ...
- 用hugo建博客的记录 · 老张不服老
前后累计折腾近6个小时,总算把搭建hugo静态博客的整个过程搞清楚了.为什么用了这么久?主要还是想偷懒,不喜欢读英文说明.那就用中文记录一下过程吧.还是中文顺眼啊. 某日发现自己有展示些东西给外网的需 ...
- ypoj 2286 佳佳买菜
题目名称:佳佳买菜 描述 佳佳是我们的ACM社团的副社长,她感觉得自己没存在感,so-由于实验室要聚餐了,佳佳决定买点菜,来做菜给大家吃.佳佳喜欢吃娃娃菜,于是她来到买菜的地方.佳佳:我要10斤娃娃菜 ...