我们在使用集合时,想到的基本就是ArrayList,LinkedList,HashMap,TreeMap等等在Jdk中存在的,为了实现一些复杂的功能,使用起来代码量并不少从而降低了可读性。
Guava Collections 可以帮助你的代码更简短精炼,更重要是它增强了代码的可读性。
本文使用的Guava版本如下:
一、 集合操作
1 集合创建
各种以s结尾的工厂类简化了集合的创建。在创建泛型实例的时候,它们使代码更加简洁
类型推导的功能,在Java 7中已经得到支持。
可以返回原返回类型的任何子类型的对象
MapMaker: 超级强大的 Map 构造类
//MapMaker 是用来构造 ConcurrentMap 的工具类。它可以用来构造ConcurrentHashMap:得到线程安全的hashMap
2 集合转换、查找、过滤、分割
Lists.transform可以很方便将一个集合转换成另外一种类型的集合。
在Java 8中的实现为
Iterables.find查找集合首个匹配的元素
在Java 8中的实现为
Collections2.filter过滤集合中所有符合特定条件的元素。
在Java 8中的实现为
Collections2.transform转换集合中元素的格式。
Lists.partition可以将一个大的集合分割成小集合,适用于分批查询、插入等场景。
3 分组
Maps.uniqueIndex可以根据集合中的唯一键把集合转换为以唯一键为key,以元素为value的Map.
Multimaps.index可以根据集合中的相同的值把集合转换为以相同值为key,以List为value的Map. 相当于一键多值Map,关于Multimaps在下文做详细讲解。
在Java 8中的实现为
4 其他
排序:
集合的交集、并集和差集:
二、 不可变集合
不可变对象有很多优点,包括:
当对象被不可信的库调用时,不可变形式是安全的;
不可变对象被多个线程调用时,不存在竞态条件问题
不可变集合不需要考虑变化,因此可以节省时间和空间。所有不可变的集合都比它们的可变形式有更好的内存利用率(分析和测试细节);
不可变对象因为有固定不变,可以作为常量来安全使用。
JDK也提供了Collections.unmodifiableXXX方法把集合包装为不可变形式,但我认为不够好:
还在使用 Collections.unmodifiableXXX() ?Immutable Collections 这才是真正的不可修改的集合
重要提示:所有Guava不可变集合的实现都不接受null值
不可变集合的几种创建方式
copyOf方法
of方法
Builder工具
三、 新的集合类型
1.Multiset
可以用两种方式看待Multiset:
没有元素顺序限制的ArrayList
Map,键为元素,值为计数
输出结果:
Guava 提供了多种Multiset实现
SortedMultiset
SortedMultiset是Multiset接口的变种,它支持高效地获取指定范围的子集。
输出结果:
2.Multimap: 一个 key 对应多个 value
每个有经验的Java程序员都在某处实现过Map>或Map>,并且要忍受这个结构的笨拙。例如,Map>通常用来表示非标定有向图。Guava的Multimap可以很容易地把一个键映射到多个值。换句话说,Multimap是把键映射到任意多个值的一般方式。
输出结果:
Multimap的各种实现
3.RangeSet
输出结果:
还存在一个RangeMap ,但是和RangeSet不同的是RangeMap不会合并相邻的映射,即便相邻的区间映射到相同的值。
4.Table
输出结果:
5BiMap: 保证 value 也不重复
BiMap是特殊的Map:
可以用inverse()反转BiMap的键值映射
保证值是唯一的,因此values()返回Set而不是普通的Collection
领取专属 10元无门槛券
私享最新 技术干货