Multimap
阿粉有时会在业务需求中使用 Map<String,List<Integer>
实现下面的需求。
1a->[1,2,3] b->4,c->[6,5]
使用 Map
+ List
这种结构比较笨拙,并且代码实现也比较繁琐。Multimap
正式 Guava 中解决这种问题的新出的一个雷。
使用 Multimap
实现代码如下:
这里阿粉使用 Multimap
子类 HashMultimap
,其行为类似为 Map<K,Set<V>>
,也就是说 Value
对应的集合内部元素不能重复。如果需要保存的重复的元素我们可以使用 ArrayListMultimap
。
Multimap
还有其他子类,如图所示:
来源于 Github
BiMap
BiMap
可以用来实现键值对的双向映射需求,这样我们就可以通过 Key
查找对对应的 Value
,也可以使用 Value
查找对应的 Key
。
这个需求如果使用 Map
实现,我们就不得不使用两个 Map
,维护双向关系,并且任何改动还要保持同步。
使用 BiMap
修改上面的代码:
这里需要注意,BiMap#put
方法不能加入重复元素, 若加入,将会抛错。如果若特定值一定要替换,可以使用 BiMap#forcePut
代替。
敲黑板,这个知识点记下来。阿粉使用过程中,就踩过这个坑。
同样的 BiMap
也有各种实现类:
来源于 Github
其他扩展集合类
Guava 另外还提供其他集合类,不过这些类使用起来有点复杂,阿粉还未在业务代码中使用过,这里简单提下,感兴趣同学可以深入了解一下。
- Table
- ClassToInstanceMap
- RangeSet
- RangeMap
集合工具类
除了上面提到的新集合类以外,Guava 提供通用的工具类:
来源于 Github
这些工具类需对使用的方法,我们可以快速创建集合,分割集合,转化集合等。
快速创建集合实例
使用工具类,我们可以快速创建集合。例如:
1List<String> list=Lists.newArrayList(); 2Set<String> set=Sets.newHashSet(); 3Map<String,String> map=Maps.newHashMap();
相比于 new
集合方法,Guava 方法创建方式更加简单。
1List<String> list=new ArrayList<String>(); 2Set<String> set=new HashSet<String>(); 3Map<String,String> map=new HashMap<String, String>();
Guava 工具类智能推导 List
泛型,再也不用两侧都重复写泛型了。
另外还可以指定集合类的初始化大小。
Lists.transform
Lists#transform
方法可以替代繁琐 for
循环,将元素转化,创建一个新集合类。
不过使用这个方法我们要注意一点。
Lists#transform
内部使用懒加载的机制,只有在调用获取的元素的时候,如 result.get
才会真正使用 Function
从源 List
获取元素,做相应的转化。每次获取元素都将会使用 function
进行转化。
所以使用 Lists#transform
得到 List
仅仅只是源 List
一个视图,任何对源 List
的元素修改,都将会被反应到创建之后的 List
。任何对创建之后 List 中的元素进行修改,都不会生效。下次再次读取元素时,将会发现相应修改的丢失了。。。
阿粉之前就踩过这个坑,如果你有这种需求,可以使用以下方式创建一个新集合:
JDK8 之前版本,阿粉经常使用该方法转化 List
中的元素。不过你如果使用 JDK8,阿粉还是推荐使用 Stream 流式编程。
交集并集差集
Sets
提供几个方法,可以快速求出两个 Set
集合的交集,并集以及差集。
不可变集合
不可变(Immutable)集合,顾名思义集合不可以被修改。初始创建不可变集合时吗,需要传入数据源,创建完成之后,集合就再也不能修改,增加,删除元素,否则将会报错。
这是一种防御性策略,防止集合在后续操作中被修改,从而引发问题。
不可变集合优点在于:
- 由于不可变集合仅仅只能读,多线程并发天然安全
- 由于不可变集合固定不变,可以将其当做常量安全,不用单线其他人修改
- 不可变集合占用更少内存空间
- 不可变集合不可以被修改,所以不用担心其他程序任意修改集合
Guava 不可变集合支持 JDK 所有集合接口:
我们可以使用如下几种方式创建不可变集合,以 ImmutableList
为例:
总结
这篇文章阿粉带大家学习开源工具 Guava 集合的相关类使用方法,日常开发中我们善于使用这些工具类,不要自己重复造轮子。
本篇文章仅仅只是介绍 Guava 一小部分功能,还有很对功能,阿粉也觉得很好用在。这里推荐大家去查看 Guava 官方 wiki,查看具体使用方法。
如果大家还想知道其他开源工具类,给阿粉点个赞,下次给大家带来十分好用开源工具类~