日常开发中,阿粉经常需要用到 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
也有许多子类。
来源于 Github
这里阿粉提醒一下大家,虽然上面说过我们可以将 Multiset<E>
看做 Map<E, Integer>
,但是 Multiset
可不是 Map
的子类,它可是 血统纯正的 Collection
子类。