老司机阿粉带你玩转 Guava 集合类(二)

简介: 日常开发中,阿粉经常需要用到 Java 提供集合类完成各种需求。Java 集合类虽然非常强大实用,但是提供功能还是有点薄弱。 举个例子,阿粉最近接到一个需求,从输入一个文档中,统计一个关键词出现的次数。代码如下

Multimap

阿粉有时会在业务需求中使用 Map<String,List<Integer>实现下面的需求。

1a->[1,2,3] b->4,c->[6,5]

使用 Map + List 这种结构比较笨拙,并且代码实现也比较繁琐。Multimap 正式 Guava 中解决这种问题的新出的一个雷。

使用 Multimap 实现代码如下:

67.jpg

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

Multimap还有其他子类,如图所示:

68.jpg

来源于 Github

BiMap

BiMap 可以用来实现键值对的双向映射需求,这样我们就可以通过 Key 查找对对应的 Value,也可以使用 Value 查找对应的 Key

这个需求如果使用 Map 实现,我们就不得不使用两个 Map,维护双向关系,并且任何改动还要保持同步。

69.jpg

使用 BiMap 修改上面的代码:

70.jpg

这里需要注意,BiMap#put方法不能加入重复元素, 若加入,将会抛错。如果若特定值一定要替换,可以使用 BiMap#forcePut代替。

敲黑板,这个知识点记下来。阿粉使用过程中,就踩过这个坑。

同样的 BiMap 也有各种实现类:

71.jpg

来源于 Github

其他扩展集合类

Guava 另外还提供其他集合类,不过这些类使用起来有点复杂,阿粉还未在业务代码中使用过,这里简单提下,感兴趣同学可以深入了解一下。

  • Table
  • ClassToInstanceMap
  • RangeSet
  • RangeMap

集合工具类

除了上面提到的新集合类以外,Guava 提供通用的工具类:

72.jpg

来源于 Github

这些工具类需对使用的方法,我们可以快速创建集合,分割集合,转化集合等。

快速创建集合实例

使用工具类,我们可以快速创建集合。例如:

1List<String> list=Lists.newArrayList();
2Set<String> set=Sets.newHashSet();
3Map<String,String> map=Maps.newHashMap();

相比于 new 集合方法,Guava 方法创建方式更加简单。

1List<String> list=new ArrayList<String>();
2Set<String> set=new HashSet<String>();
3Map<String,String> map=new HashMap<String, String>();

Guava 工具类智能推导 List 泛型,再也不用两侧都重复写泛型了。

另外还可以指定集合类的初始化大小。

73.jpg

Lists.transform

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

74.jpg

不过使用这个方法我们要注意一点。

Lists#transform 内部使用懒加载的机制,只有在调用获取的元素的时候,如 result.get 才会真正使用 Function 从源 List 获取元素,做相应的转化。每次获取元素都将会使用 function 进行转化。

所以使用 Lists#transform 得到 List 仅仅只是源 List 一个视图,任何对源 List 的元素修改,都将会被反应到创建之后的 List 。任何对创建之后 List 中的元素进行修改,都不会生效。下次再次读取元素时,将会发现相应修改的丢失了。。。

阿粉之前就踩过这个坑,如果你有这种需求,可以使用以下方式创建一个新集合:

75.jpg

JDK8 之前版本,阿粉经常使用该方法转化 List 中的元素。不过你如果使用 JDK8,阿粉还是推荐使用 Stream 流式编程。

交集并集差集

Sets 提供几个方法,可以快速求出两个 Set 集合的交集,并集以及差集。

不可变集合

不可变(Immutable)集合,顾名思义集合不可以被修改。初始创建不可变集合时吗,需要传入数据源,创建完成之后,集合就再也不能修改,增加,删除元素,否则将会报错。

这是一种防御性策略,防止集合在后续操作中被修改,从而引发问题。

不可变集合优点在于:

  • 由于不可变集合仅仅只能读,多线程并发天然安全
  • 由于不可变集合固定不变,可以将其当做常量安全,不用单线其他人修改
  • 不可变集合占用更少内存空间
  • 不可变集合不可以被修改,所以不用担心其他程序任意修改集合

Guava 不可变集合支持 JDK 所有集合接口:

76.jpg

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

77.jpg

总结

这篇文章阿粉带大家学习开源工具 Guava 集合的相关类使用方法,日常开发中我们善于使用这些工具类,不要自己重复造轮子。

本篇文章仅仅只是介绍 Guava 一小部分功能,还有很对功能,阿粉也觉得很好用在。这里推荐大家去查看 Guava 官方 wiki,查看具体使用方法。

如果大家还想知道其他开源工具类,给阿粉点个赞,下次给大家带来十分好用开源工具类~

相关文章
|
网络协议 Unix Linux
计算机网络 套接字函数 | socket、bind、listen、accept、connect
计算机网络 套接字函数 | socket、bind、listen、accept、connect
254 0
|
监控 数据挖掘 数据安全/隐私保护
ERP系统中的客户关系管理(CRM)
【7月更文挑战第25天】 ERP系统中的客户关系管理(CRM)
880 3
端口被占用?两步解决端口占用问题
端口被占用?两步解决端口占用问题
1358 0
|
消息中间件 关系型数据库 MySQL
FlinkSQL 实时采集Kafka内容到MySQL(实战记录)
FlinkSQL 实时采集Kafka内容到MySQL(实战记录)
511 0
|
编解码
node封装一个图片拼接插件
node封装一个图片拼接插件
243 0
|
网络协议 开发工具
小白都会的邮件推送?你还不会吗?
小白都会的邮件推送?你还不会吗?
585 1
小白都会的邮件推送?你还不会吗?
|
人工智能 物联网 开发工具
AIoT让一个屏有了100种用法
应用定义屏幕,点亮智慧空间
637 1
AIoT让一个屏有了100种用法
|
存储 Java C语言
Java面向对象进阶5——包和final(含源码阅读)
包在操作系统中其实就是一个文件夹。包是用来分门别类的管理技术,不同的技术类放在不同的包下,方便管理和维护
208 0
Java面向对象进阶5——包和final(含源码阅读)
|
前端开发
CSS样式控制页面的几种方式
1.行内样式。 把样式写在元素标记之间。 用css控制页面样式的行内样式 2.内嵌式 把样式写在head之间,并且用<style></style>包括起来。
301 0