Guava 工程是被 Google 的 Java 项目广泛依赖的核心库。
谷歌从日常的工作中提取出了很多高效率的 API 方法,从而诞生了 guava 工具包。
guava 的优点是:
- 高效设计良好的 API ;
- 遵循高效的 java 语法实践;
- 代码更简洁,节省时间与资源,提高开发生产力。
guava 的意思是番石榴。
Guava 包提供了很多特性,这次我们主要讲讲集合。
1 初始化
利用 Guava 的静态工厂方法,可以更简洁地初始化集合中的元素。
JDK 方式:
Guava 方式:
2 Bimap
Bimap 是一个映射,可以通过 key 得到 value ,也可以通过 value 得到 key 。
Java 集合类库中的 Map ,键( Key )是唯一的,而值( Value )可以不唯一 。而 bimap 要求 key 和 value 都唯一,如果 key 不唯一则覆盖 key ,如果 value 不唯一则抛异常。
3 Multiset
Set 的特性可以分为两种:是否有序和是否允许重复。根据这两个特性可以画出一个四象限图。可以看出,Multiset 填补了无序+允许重复这一区域的空白。
Multiset 提供了很多集合方面的实现与操作。
HashMultiset: 元素存放于HashMap;
LinkedHashMultiset: 元素存放于 LinkedHashMap ,即元素的排列顺序由第一次放入的顺序决定;
TreeMultiset: 元素被排序存放于 TreeMap;
EnumMultiset: 元素必须是 enum 类型;
ImmutableMultiset: 不可修改的 Mutiset。
普通集合操作类似于我们在大学时曾经学过的集合计算。
比较特别的是,部分合并操作。
可以看到,如果 A U B,只是把集合 A 所没有的元素合并过来。在左边的元素是主导这次合并规则的元素。
4 Multimap
Multimap 中,一个 key ,可以对应多个值。形如: Map<K , Set<V>>
这样的数据结构。
假设有一组单词,我们可以使用 Multimap 来把这些单词依据长度分组:
输出:
代码步骤说明:
- 首先使用流式编程,初始化单词组;
- 利用函数式编程,定义分组规则,这里依据单词长度进行分组;
- 利用 Multimaps.index() 方法执行分组。
利用 Multimap ,我们还可以实现映射反转:
输出: