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学习笔记目录
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...
- guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁
guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁 1,本文翻译自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code- ...
- guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用
guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...
- Guava学习笔记(一)概览
Guava是谷歌开源的一套Java开发类库,以简洁的编程风格著称,提供了很多实用的工具类, 在之前的工作中应用过Collections API和Guava提供的Cache,不过对Guava没有一个系统 ...
- Guava学习笔记(4):Ordering犀利的比较器
转自:http://www.cnblogs.com/peida/p/Guava_Ordering.html Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering ...
- Guava学习笔记(3):复写的Object常用方法
转自:http://www.cnblogs.com/peida/p/Guava_Objects.html 在Java中Object类是所有类的父类,其中有几个需要override的方法比如equals ...
- Guava学习笔记(2):Preconditions优雅的检验参数
转自:http://www.cnblogs.com/peida/p/Guava_Preconditions.html 在日常开发中,我们经常会对方法的输入参数做一些数据格式上的验证,以便保证方法能够按 ...
- Guava学习笔记(1):Optional优雅的使用null
转自:http://www.cnblogs.com/peida/archive/2013/06/14/Guava_Optional.html 参考:[Google Guava] 1.1-使用和避免nu ...
- Guava学习笔记:Google Guava 类库简介
http://www.cnblogs.com/peida/tag/Guava/ Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, cachin ...
随机推荐
- QDU-GZS与素数大法(素数筛法)
Description 自从GZS成为G神之后,追随者不计其数,更是有了大名鼎鼎的拜神论: "吾尝终日编程也,不如须臾之拜拜G神也:吾尝打字刷题也,不如一日三拜G神也: 拜拜G神,程序非长也 ...
- A Simple Math Problem (矩阵快速幂)
Lele now is thinking about a simple function f(x). If x < 10 f(x) = x. If x >= 10 f(x) = a0 ...
- Linux上常用命令整理(一)—— cat
近几个月刚从windows上转过来,开始慢慢熟悉linux,先不撕比到底哪个更好,首先要怀着相互借鉴的精神去了解各个平台. Linux上做开发,除去使用文本编辑器做开发的大神之外,大家(包括我这种菜鸟 ...
- C. Journey
C. Journey time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- nodejs 实践:express 最佳实践(三) express 解析
nodejs 实践:express 最佳实践(三) express 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固, ...
- 给Visual Studio更换皮肤和背景图
1.先安装更换皮肤的插件 VS菜单栏里面找到:工具>扩展和更新>联机>搜索: Theme Editor 下载并安装: 安装后先不着急重启VS 然后,安装可更改背景图片的插件:工具&g ...
- 《移动Web前端高效开发实战》笔记2——使用Gulp构建一个ECMAScript 6和Sass应用
8.3.1 安装和配置 运行Gulp需要Node.js环境,请参看第二章内容搭建Node.js环境.使用NPM全局安装Gulp,命令如下: npm install gulp-cli –g 然后,在项目 ...
- html页面和jsp页面的区别
html页面: html页面是静态页面,可以使用html+css+js实现页面的各种效果,单纯使用html布局出来的页面是设定好的页面,可以使用本地浏览器打开.同时搭配使用ajax实现数据交互效果的页 ...
- Linux基础环境_安装配置教程(CentOS7.2 64、JDK1.8、Tomcat8)
Linux基础环境_安装配置教程 (CentOS7.2 64.JDK1.8.Tomcat8) 安装包版本 1) VMawre-workstation版本包 地址: https://my.vmw ...
- Python+Selenium之摘取网页上全部邮箱
本文转载:http://blog.csdn.net/u011541946/article/details/68485981 练习场景:在某一个网页上有些字段是我们感兴趣的,我们希望摘取出来,进行其他操 ...