Google Collections 初探

小编辑 发布于 2010/05/25 09:20
阅读 1K+
收藏 5

Google Collections 是Google的一个开源的collection扩展包,有效地丰富了目前JDK中的collections的操作方式,Google又一精品设计。

Immutable系列 - 让"真正不可变"成为可能

ImmutableMap 和 ImmutableSet 一经初始化是无法改变的,包括往里面新增数据。可以用应用于一些初始化数据,极大地减少了因为编码习惯而引起的代码风险。曾经在线上发生类似的问题:

        /**
* 号码库对应的类目
* 4001 QQ号码
* 50002402 移动卡号
* 50002403 联通卡号
* 50011764 电信卡号
*/

final static List<Integer> applyCatId = new ArrayList<Integer>();
{
applyCatId.add(4001);
applyCatId.add(50002402);
applyCatId.add(50002403);
applyCatId.add(50011764);
}

作者原来的本意是希望在把这些数据当作初始化数据添加到List中去,但是因为编码的时候少写了一个static导致每次new这个类的的时候都往 list里新增初始化数据,进而导致系统内存溢出,最终导致系统崩溃。

下面是 ImmutableMap 和 ImmutableSet 一些例子:

        /**
* ImmutableMap 和 ImmutableSet 一经初始化是无法改变的,包括往里面新增数据。
* 可以用应用于一些初始化数据,极大地减少了因为编码习惯而引起的代码风险
*/

 
// 不可修改的Map 和 Set 适合存放一些初始化数据
// of 操作非常贴心和实在
final static Map<String, Integer> immutableMap = ImmutableMap.of("风清扬", 42,
"铁木真", 44, "黄药师", 32);
 
// 如果你有很多的初始化数据那就用下面的方法吧
static Map<String, Integer> immutableMapMore = null;
static {
Builder<String, Integer> mapBuilder = ImmutableMap.builder();
mapBuilder.put("风清扬", 1);
immutableMapMore = mapBuilder.build();
}
 
// 下面是Set的例子
final static Set<String> immutableSet = ImmutableSet.of("风清扬", "铁木真", "黄药师");
 
static Set<String> immutableSetMore = null;
static {
com.google.common.collect.ImmutableSet.Builder<String> setBuilder = ImmutableSet
.builder();
setBuilder.add("风清扬");
immutableSetMore = setBuilder.build();
}

Multimap系列 - 让Map操作更简单一些

Multimap的出现可以减少我们的编码量,它主要应用以下类似的场景:学生分班打印:小宝=1班,小白=2班。。。我们需要按班级将所有的人员 划分开来,并且能打印出各个班级的成员。

        //Multimap的使用
//在现实编码中我们经常会遇到以下的应用场景:
//学生分班打印:小宝=1班,小白=2班。。。
//我们需要按班级将所有的人员划分开来,并且能打印出各个班级的成员。
String[][] SAMPLE_DATA = {{"小宝","1"},{"小白","2"},{"小兰","1"}};
 
//我们以前的设计
Map<String,Set<String>> map = new HashMap<String,Set<String>>();
for(String[] person : SAMPLE_DATA){
String name = person[0];
String clazz = person[1];
//最少要写4行代码来完成相应的功能
Set<String> _clazzSet = map.get(clazz);
if(_clazzSet == null){
_clazzSet = new HashSet<String>();
}
_clazzSet.add(name);
map.put(clazz, _clazzSet);
}
 
//使用Multimap
//Google 看来不打喜欢用new的方式
Multimap<String,String> multimap = HashMultimap.create();
for(String[] person : SAMPLE_DATA){
String name = person[0];
String clazz = person[1];
//一行就搞定了
multimap.put(clazz, name);
}
 
//Multimap 全部采用HashMultimap.create() factory 模式产生新的对象
//类似的还有LinkedHashMultimap.create() ArrayListMultimap.create()
//等等常见的collect类型

BiMap系列 - 弥补了JDK的空缺

	//BiMap 是一个key,value都必须是唯一 的map,所以 他们的 key - value 是可以互查的。
BiMap<String,Integer> biMap = HashBiMap.create();
biMap.put("UUID-1", 1);
biMap.put("UUID-2", 2);
//key - value 互换
biMap.inverse();

原文转自 http://dueam.org/

加载中
0
james_you
james_you
确实方便不少
0
夲仒無道
夲仒無道

//我们以前的设计
	Map<String,Set<String>> map = new HashMap<String,Set<String>>();
	for(String[] person : SAMPLE_DATA){
		String name = person[0];
		String clazz = person[1];
		//最少要写4行代码来完成相应的功能
		Set<String> _clazzSet = map.get(clazz);
		if(_clazzSet == null){
			_clazzSet = new HashSet<String>();
		}
		_clazzSet.add(name);
		map.put(clazz, _clazzSet);
	}
 
	//使用Multimap
	//Google 看来不打喜欢用new的方式
	Multimap<String,String> multimap = HashMultimap.create();
	for(String[] person : SAMPLE_DATA){
		String name = person[0];
		String clazz = person[1];
		//一行就搞定了
		multimap.put(clazz, name);
	}

这个不是扯淡么?两个Map的数据结构都不一样,什么一行搞定,四行搞定的,别忽悠人行不?



蝶衣人生
蝶衣人生
是为了实现:"我们需要按班级将所有的人员划分开来,并且能打印出各个班级的成员。"
返回顶部
顶部