首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Guava中的集合

我们在使用集合时,想到的基本就是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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190826A0L9Q400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券