在日常开发中,阿粉经常需要使用Java提供集合类来满足各种需求。Java集合类虽然很强大很实用,但是在提供功能上还是有点弱。例如,阿芬最近收到一个请求,要统计输入文档中某个关键字的出现次数。代码如下:虽然这个需求可以用Map轻松解决,但是阿芬还是觉得这种写法有点笨拙。如果没有空判断,就会引发NPE异常。如果很多地方都需要函数,我们可以将它们抽象出来,封装成工具类。但是,您不需要自己封装上述功能。来自谷歌的一款开源工具——Guava,可以轻松解决上述统计问题。Guava简介Guava是Google开源的一个工具类,包含了很多Google内部Java项目所依赖的核心类。Guava扩展了Java基础类项目,如集合、并发等,还增加了一些其他强大的功能,如缓存、限流等功能。此外,Guava还引入了一些类,比如Optional,Java开发者甚至学习了这些类,后来加入到JDK中。目前GuavaGithub仓库有36kstar,可见Guava的火爆程度。Guava的核心功能包括多个模块。今天阿粉主要带大家玩转Guava收藏课。扩展集合类Guava创建了许多新的集合类型,JDK没有,但显然对我们的日常生活很有用。这些新类型使用JDK集合接口规范,所以使用方法与JDK集合框架类似,并没有增加使用难度。Multiset阿粉第一次看到Multiset类,还以为是Set接口的子类。其实这个“集合”只是集合的一个数学概念。Multiset继承了JDK的Collection接口,我们可以多次添加同一个元素。另外,Multiset最大的特异性就是对元素进行计数。我们可以把它当作Map,用Multiset来轻松解决一开始的问题。使用Multiset简化您的代码,再也不用担心新的NPE。与JDK集合类一样,Multiset有许多子类。这里来自Github,提醒一下大家,虽然上面说了我们可以把Multiset看成一个MapMultimap,有时候我用的是Map1a->[1,2,3]b->4,c->[6业务要求。,5]使用Map+List的结构比较笨拙,代码实现也比较繁琐。Multimap是官方在Guava中解决这个问题的新矿。使用Multimap的实现代码如下:这里阿粉使用了Multimap的子类HashMultimap,其行为类似于MapMultimap等子类,如图:来自Github的BiMapBiMap可以用来实现键值对的双向映射需求,这样我们就可以通过Key找到对应的Value,或者使用Value来找到对应的Key。如果这个需求是用Map来实现的,我们就得用两个Map来维护双向关系,任何变化都必须保持同步。使用BiMap修改以上代码:这里需要注意的是BiMap#put方法不能添加重复的元素。如果添加,将抛出错误。如果必须替换特定值,则可以改用BiMap#forcePut。敲黑板,把这个知识点记下来。在使用的过程中,阿芬就踩到了这个坑。同样的BiMap还有各种实现类:从Github上其他的扩展集合类,Guava也提供了其他的集合类,但是这些类使用起来有点复杂,阿芬也没有在业务代码中使用过。这里简单提一下,有兴趣的同学可以多了解一下。TableClassToInstanceMapRangeSetRangeMap集合工具类除了上面提到的新的集合类,Guava还提供了通用的工具类:这些工具类需要用到的方法来自Github,我们可以快速的创建集合,拆分集合,变换集合等。创建集合实例使用工具类,我们可以快速创建集合。例如:1List
