使用guava带来的方便
guava是在原先google-collection 的基础上发展过来的,是一个比较优秀的外部开源包,最近项目中使用的比较多,列举一些点。刚刚接触就被guava吸引了。。。
这个是guava的一个官网ppt里面的介绍:
|
1
2
3
4
5
|
其实你可能发现,一些基本的校验完全可以自己写,但是。。这些东西仅仅是看起来比较简单,实际上可能比我们想想的要复杂;用一个公共的lib,别人可能更加容易理解你的代码;当你用一个主流的开源包的时候,你可能在主流中;当你发现一个可以提升的点的 时候,如果仅仅是修改自己的私有包,可能没有多少人能够受益; |
1、非空检查,参数在赋值的时候就做一个检查
|
1
2
|
String inputName = "iamzhongyong";String name = Preconditions.checkNotNull(inputName); |
这个减少了代码行数,认为变量必须赋值才可以使用。
多条件校验
|
1
2
|
String inputName = "iamzhongyong";Preconditions.checkArgument(inputName!=null && !"".equals(inputName),"input is null"); |
能够有效的减少代码行数
此外Preconditions中还有多个校验方法,可以优雅的进行判断了。
2、优雅的使用null
空指针异常是我们再写代码的时候经常遇到的,guava提供了Optional来让你不得不思考null的问题
Optional.of(T):获得一个Optional对象,其内部包含了一个非null的T数据类型实例,若T=null,则立刻报错。
Optional.absent():获得一个Optional对象,其内部包含了空值,内部代码看,是返回了Absent的一个实例。
Optional.fromNullable(T):将一个T的实例转换为Optional对象,T的实例可以不为空,也可以为空[Optional.fromNullable(null),和Optional.absent()等价。
|
1
2
3
4
|
Optional<String> name = Optional.of("iamzhongyong"); if(name.isPresent()){ System.out.println(name.get()); } |
3、Object中常用的方法
例如我们常见的equals方法和hashCode方法,Objects中都有与之对应的方法提供;
同时,toString是我们比较常用的,Objects.toStringHelper方法十分方便
|
1
2
3
4
5
6
7
8
|
public class StringHelp { public String name; public int age; @Override public String toString() { return Objects.toStringHelper(this).add("name", this.name).add("age", this.age).toString(); }} |
4、字符转链接(Joiner 类)
|
1
2
3
4
5
6
7
8
|
public static void main(String[] args) {
List<String> names = Lists.newArrayList();
names.add("iamzhongyong");
names.add("bixiao.zy");
StringBuilder sb = new StringBuilder();
String rs = Joiner.on("--").appendTo(sb, names).toString();
System.out.println(rs);
}
|
5、字符串分隔符
这个时候你可能说JDK自己有分割器,但是其实guava这个更加灵活,其实JDK的那个性能不咋滴
|
1
2
3
4
5
6
|
public static void main(String[] args) {
String s = "dd sfsfs , dsfsf,ssfdfsdffsdfsf.sdfsfs,msfds";
for(String name : Splitter.on(",").trimResults().split(s)){
System.out.println(name);
}
}
|
6、不可变的集合(Immutable)
这里就拿一个map为例子,初始化一个集合,然后向里面放置几个不变的集合
|
1
2
3
|
Map<Integer,String> mapa = new HashMap<Integer,String>();
mapa.put(122, "iamzhongyong");
mapa.put(1222, "bixiao.zy");
|
现在用Immutable就可以很简单的完成了
|
1
2
|
ImmutableMap<Integer, String> map = ImmutableMap.of(122,"iamzhongyong",1222,"bixiao.zy");
System.out.println(map.toString());
|
7、一个key对应多个Valve的情况
我们经常遇到这种,一个key有多个value的情况,一般的做法如下:Map<Key,List<Value>>的数据结构去搞,
但是现在又办法了,可以使用Multimap来解决这个问题,简洁明了
|
1
2
3
4
5
|
Multimap<Integer, String> keyValues = ArrayListMultimap.create(); keyValues.put(1, "a");
keyValues.put(1, "b");
keyValues.put(2, "c");
System.out.println(keyValues.toString());
|
8、本地缓存
guava的缓存设计的比较巧妙,这里就简单介绍一下,guava的缓存创建分为两种,一种是CacheLoader的方式,一种是callback的方式
参数的话就不多介绍了,直接在CacheBuilder中可以看到,类似这个
|
1
2
3
4
5
|
CacheBuilder.newBuilder() .maximumSize(10)
.initialCapacity(3)
.expireAfterWrite(10, TimeUnit.SECONDS)
.build();
|
下面这个例子是callback的形式
|
1
2
3
4
5
6
7
8
9
10
11
12
|
public void getNameFromLocalCache() throws Exception{
//new一个cache的对象出来
Cache<String/*name*/,String/*nick*/> cache = CacheBuilder.newBuilder().maximumSize(10).build();
//在get的时候,如果缓存里面没有,则通过实现一个callback的方法去获取
String name = cache.get("bixiao", new Callable<String>() {
public String call() throws Exception {
return "bixiao.zy"+"-"+"iamzhongyong";
}
});
System.out.println(name);
System.out.println(cache.toString());
}
|
下面这个例子是LoadingCache的
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public void getNameLoadingCache(String name) throws Exception{
LoadingCache<String, String> cache = CacheBuilder.newBuilder()
//设置大小,条目数
.maximumSize(20)
//设置失效时间,创建时间
.expireAfterWrite(20, TimeUnit.SECONDS)
//设置时效时间,最后一次被访问
.expireAfterAccess(20, TimeUnit.HOURS)
//移除缓存的监听器
.removalListener(new RemovalListener<String, String>() {
public void onRemoval(RemovalNotification<String, String> notification) {
System.out.println("有缓存数据被移除了");
}})
//缓存构建的回调
.build(new CacheLoader<String, String>(){//加载缓存
@Override
public String load(String key) throws Exception {
return key + "-" + "iamzhongyong";
}
});
System.out.println(cache.get(name));
cache.invalidateAll();
}
|
9、集合 并集、交集、补集的方法
|
1
2
3
4
5
6
7
8
9
10
11
|
HashSet setA = Sets.newHashSet(1, 2, 3, 4, 5);
HashSet setB = Sets.newHashSet(4, 5, 6, 7, 8);
SetView union = Sets.union(setA, setB);
System.out.println(union);
SetView difference = Sets.difference(setA, setB);
System.out.println(difference);
SetView intersection = Sets.intersection(setA, setB);
System.out.println(intersection);
|
这些仅仅是一个开始
使用guava带来的方便的更多相关文章
- 使用Guava EventBus构建publish/subscribe系统
Google的Guava类库提供了EventBus,用于提供一套组件内publish/subscribe的解决方案.事件总线EventBus,用于管理事件的注册和分发.在系统中,Subscribers ...
- Guava Supplier实例
今天想讲一下Guava Suppliers的几点用法.Guava Suppliers的主要功能是创建包裹的单例对象,通过get方法可以获取对象的值.每次获取的对象都为同一个对象,但你和单例模式有所区别 ...
- Guava学习笔记(1):Optional优雅的使用null
转自:http://www.cnblogs.com/peida/archive/2013/06/14/Guava_Optional.html 参考:[Google Guava] 1.1-使用和避免nu ...
- guava常用操作
Jack47 我思故我在 Google Java编程库Guava介绍 本系列想介绍下Java下开源的优秀编程库--Guava[ˈgwɑːvə].它包含了Google在Java项目中使用一些核心库,包含 ...
- 使用 Google Guava 美化你的 Java 代码
文章转载自:http://my.oschina.net/leejun2005/blog/172328 目录:[ - ] 1-使用 GOOGLE COLLECTIONS,GUAVA,STATIC IMP ...
- guava学习--Supplier Suppliers
转载:http://www.cnblogs.com/jun-ma/p/4850591.html Guava Suppliers的主要功能是创建包裹的单例对象,通过get方法可以获取对象的值.每次获取的 ...
- Guava 10-散列
概述 Java内建的散列码[hash code]概念被限制为32位,并且没有分离散列算法和它们所作用的数据,因此很难用备选算法进行替换.此外,使用Java内建方法实现的散列码通常是劣质的,部分是因为它 ...
- [Guava官方文档翻译] 7. Guava的Immutable Collection(不可变集合)工具 (Immutable Collections Explained)
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3538666.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...
- [置顶] Guava学习之ArrayListMultimap
ArrayListMultimap类的继承关系如下图所示: Guava ArrayListMultimap List Multimap 是一个接口,继承自 Multimap 接口.ListMultim ...
随机推荐
- 大前端时代已经到来!传智播客2015之WEB前端视频教程(全套教程共15G)
大前端时代已经到来!传智播客2015之WEB前端视频教程(全套教程共15G)大前端时代已经到来!如今,前端开发工程师的职责,不是只有切图.制作网页这么简单哦! G:\传智播客2015-WEB前端视频教 ...
- iOS后台定位实现
iOS后台定位实现 (2013-01-24 16:43:12) 工作中碰到一个定位的应用场景:app需要在后台运行,实时上传用户地理位置. 苹果对iOS的规范性在提升了app的品质的同时也 ...
- [MetaHook] R_RicochetSprite
By hzqst void R_RicochetSprite(float *pos, model_t *pmodel, float duration, float scale) { TEMPENTIT ...
- 20145233韩昊辰 《Java程序设计》实验报告一:Java开发环境的熟悉(Windows+IDEA)
20145233 <Java程序设计>实验报告一:Java开发环境的熟悉 实验要求 使用JDK编译.运行简单的Java程序: 使用IDEA 编辑.编译.运行.调试Java程序. 实验内容 ...
- 0.HBase In Action(HBase实战,翻译)
1.HBase In Action 第一章-HBase简介(后续翻译中) 2.HBase In Action 第一章-HBase简介(1.1数据管理系统:快速学习) 3.HBase In Action ...
- 我的权限系统设计实现MVC4 + WebAPI + EasyUI + Knockout(四)授权代码维护
一.前言 权限系统设计中,授权代码是用来控制数据访问权限的.授权代码说白了只是一树型结构的数据,没有什么其它的业务意义.那么这个页面的功能也就非常简单授权代码维护:新增.修改.删除授权代码数据. 二. ...
- Dropbox的可用Hosts文件
108.160.167.203 www.dropbox.com 108.160.167.203 dropbox.com 108.160.165.211 dl-client677.dropbox.com ...
- 编写兼容性JS代码
前文介绍了: 1 DOM四个常用的方法 2 使用DOM核心方法完成属性填充 本篇主要介绍在JS中需要注意的几个地方,另外为了减小html与javascript的耦合使用java进行onclick方法编 ...
- 软工实践练习——使用Git进行代码管理
GITHUB上的预备活动: 注册 创建小组Organization,邀请组员进来 将代码库fork到小组Organization底下 下载并使用GIT: Git的安装 使用Git进行代码管理 1.从百 ...
- cursor:pointer的意思
cursor规则是设定网页浏览时用户鼠标指针的样式,也就是鼠标的图形形状cursor:pointer设定鼠标的形状为一只伸出食指的手,这也是绝大多数浏览器里面鼠标停留在网页链接上方时候的样式另外可以选 ...