使用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 ...
随机推荐
- 构建高转化率的着陆页-PS+HTML+网络营销
课程简介 本课程是全网独家专业的着陆页课程,课程完整的再现了整个着陆页实战案例的开发过程,包括:策划.设计和实现.上线后的推广.优化及提高转化率的技巧等,本套课程能帮助您迅速掌握着陆页的能力,迅速洞察 ...
- Caffe学习系列(9):运行caffe自带的两个简单例子
为了程序的简洁,在caffe中是不带练习数据的,因此需要自己去下载.但在caffe根目录下的data文件夹里,作者已经为我们编写好了下载数据的脚本文件,我们只需要联网,运行这些脚本文件就行了. 注意: ...
- 实现可以滑动的GrildView,类似美团网首页的GrildView功能菜单
首先上实现效果图,不会做动态图,就先凑合着看吧 使用了网上的一个开源控件viewpagerindicator,可以自定义切换时候显示的标记,圆点,或者下划线. GrildView显示的是手机上的全部a ...
- Flex的正则表达式匹配速度与手工代码的比较
flex是一个词法分析器生成器,它是编译器和解释器编程人员的常用工具之一.flex的程序主要由一系列带有指令(称为动作代码)的正则表达式组成.在匹配输入时,flex会将所有的正则表达式翻译成确定性有穷 ...
- 技术分析:Femtocell家庭基站通信截获、伪造任意短信
阿里移动安全团队与中国泰尔实验室无线技术部的通信专家们一起,联合对国内运营商某型Femtocell基站进行了安全分析,发现多枚重大漏洞,可导致用户的短信.通话.数据流量被窃听.恶意攻击者可以在免费申领 ...
- 一个基于.NET平台的自动化/压力测试系统设计简述
AutoTest系统设计概述 AutoTest是一个基于.NET平台实现的自动化/压力测试的系统,可独立运行于windows平台下,支持分布式部署,不需要其他配置或编译器的支持.(本质是一个基于协议的 ...
- css3动画 bug 2点
1. .myanimate{ transition-property: left;transition-duration: .3s;transition-timing-function: ease } ...
- Object C学习笔记20-结构体
在学习Object C中的过程中,关于struct的资料貌似非常少,查阅了C方面的资料总结了一些学习心得! 一. 定义结构 结构体是一种数据类型的组合和数据抽象.结构体的定义语法如下: struct ...
- 最新app store 应用提交经验分享
由于之前提交实在3月份的时候,后来长时间没有提交了,最近又需要提交,发现苹果已经发生翻天覆地的变化了,真是跟不上时代了啊.... 之前提交的基本也是从网上看的,前面的证书安装部分其实基本是一样的没什么 ...
- [Json.net]Linq to Json
引言 上篇学习了json.net的基本知识,这篇学习linq to json. 上篇文章:[Json.net]快速入门 Linq to Json Linq to Json是用来快速操作json对象的, ...