资源描述:
《guava是个风火轮之基础工具(1)-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Guava是个风火轮Z基础工具(1)-编程开发技术Guava是个风火轮之基础工具(1)原文出处:潘家邦的博客・、F4a刖5Guava是Java开发者的好朋友。虽然我在开发屮使用Guava很长时间了,GuavaAPI的身影遍及我写的生产代码的每个角落,但是我用到的功能只是Guava的功能集中一个少的可怜的真子集,更别说我一直没有吋间认真的去挖掘Guava的功能,没有时间去学习Guava的实现。直到最近,我开始阅读^GettingStartedwithGoogleGuava,感觉有必耍将我学习和使用Guava的一些东四记录下来。Joiner我们经常需要将几个字符
2、串,或者字符串数组、列表之类的东西,拼接成一个以指定符号分隔各个元素的字符串,比如把[1,2,3]拼接成“123”。在Python中我只需要简单的调用str.join函数,就可以了,就像这样。''・join(map(str,[1,2,3]))到了Java屮,如果你不知道Guava的存在,基木上就得手写循环去实现这个功能,代码瞬间变得±1陋起來。Guava为我们提供了一套优雅的API,让我们能够轻而易举的完成字符串拼接这一简单任务。还是上面的例子,借助Guava的Joiner类,代码瞬间变得优雅起来。Joiner.on('').join(l,2,3);被拼接的
3、对象集,可以是硬编码的少数几个对象,可以是实现了Tterable接口的集合,也可以是迭代器对象。除了返回一个拼接过的字符串,Joiner述可以在实现了Appendable接口的对象所维护的内容的末尾,追加字符串拼接的结果。StringBuildersb二newStringBuilder(,zresult:/z);Joiner,on(,z“).appendTo(sb,1,2,3);System.out.println(sb);//rcsult:123Guava对空指针冇着严格的限制,如果传入的对象屮包含空指针,Joiner会直接抛出NPEo与此同时,Joine
4、r提供了两个方法,让我们能够优雅的处理待拼接集合屮的空指针。如果我们希望忽略空指针,那么可以调用skipNulls方法,得到一个会跳过空指针的Joiner实例。如果希望将空指针变为某个指定的值,那么可以调用useForNull方法,指定用来替换空指针的字符串。Joiner.on(,')・skipNulls()・join(l,null,3);//l3Joiner.on('').useForNull("None〃).join(l,null,3);//lNone3需要注意的是,Joiner实例是不可变的,skipNulls和useForNul1都不是在原实例上修改
5、某个成员变量,而是生成一个新的Joiner实例。Joiner.MapjoinerMapjoiner是Joiner的内部静态类,用于帮助将Map对彖拼接成字符串。Joiner.on(.withKeyValueSeparator(〃二“).join(ImmutableMap.of仃,2,3,4));//l二2#3二4withKeyValueScparator方法指定了键与值的分隔符,同时返回一个Mapjoiner实例。有些家伙会往Map里插入键或值为空指针的键值对,如果我们要拼接这种Map,千万记得要用useForNull对Mapjoiner做保护,不然NPE妥
6、妥的。源码分析源码來口Guava1&0。Joiner类的源码约450行,其中大部分是注释、函数重载,常用手法是先实现一个包含完整功能的函数,然后通过各种封装,把不常用的功能隐藏起来,提供优雅简介的接口。这样子的好处显而易见,用户可以使用简单接口解决80%的问题,那些罕见而复杂的需求,交给全功能函数去支持。初始化方法由于构造函数被设置成了私冇,Joiner只能通过Joiner#on函数来初始化。最基础的Joiner#on接受一个字符串入参作为分隔符,而接受字符入参的Joiner#。n方法是前者的重载,内部使用StringttvalueOf函数将字符变成字符串后
7、调用前者完成初始化。或许这是一个利于字符串内存回收的优化。追加拼接结果整个Joiner类最核心的函数莫过于?〈AextendsAppendable>Joiner#appendTo(A,lterator»,一切的字符串拼接操作,最后都会调用到这个函数。这就是所谓的全功能函数,其他的一切appendTo只不过是它的重载,一切的join不过是它和它的重载的封装。publicAappendTo(Aappendable,Iterator>parts)throwsIOExccption{checkNotNull(appen
8、dable);if(parts.hasNext())