通过使用guava库,让代码简洁易扩展。
1、条件检查
业务代码书写过程中,各种判空和参数检查是不可避免的,重复繁琐的代码让项目显得臃肿丑陋。所以我们可以借用guava封装前置条件检查的函数,下面介绍两个最常用的方法。
checkArgument(boolean) 检查boolean是否为true,用来检查传递给方法的参数
checkNotNull(T) 检查value是否为null,该方法返回value,可内嵌使用。
2、排序器
Ordering是Guava最常用的Comparator类,比comparator更易扩展。
A Ordering的新建
Order<String> natural = Ordering.natural(); //使用自然顺序, 例如:整数从小到大,字符串是按字典顺序
Order<String> usingToString = Ordering.usingToString(); //使用toString()返回的字符串按字典顺序进行排序
Ordering byLengthOrdering =new Ordering() {@Override public intcompare(@NullableString s,@NullableString t1) {returnInts.compare(s.length(),t1.length());}}; //自定义排序规则
B Ordering的使用
reverse() //相反的排序
isOrdered(Collection<T> c) //是否是有序的
sortedCopy(Collection<T> c) //返回排序好的队列
3、集合
集合类的封装,不再需要繁琐的编码方式。
A 不可变集合
ImmutableSet/ImmutableList/ImmutableMap //不可变
ImmutableSortedSet //自动排序
ImmutableMultiset //可以重复,可以统计某个值在 set集合中有多少个
B 特殊集合
BiMap //双向Map,可以通过reverse()反转key-value
MultiMap //value可为一个list
RangeMap //描述了”不相交的、非空的区间”到特定值的映射,不合并相邻的区间
Forwarding //装饰器,类继承ForwardingXXX,可以重新方法add/delegate等方法
4、缓存 Guava Cache
cache是线程安全的,类似于concurrentMap,但是内部封装更多的方法
http://ifeve.com/google-guava-cachesexplained/
5、函数式编程
重点学习的部分,将繁琐的代码简化。函数式编程最常见的就是用于集合的转换和过滤。
A list值转换

B list转换为map

C 过滤 predicate

6、guava的并发编程
重点是ListenableFuture,ListenableFuture可以监控Future是否执行完成。Future的计算是异步的,但是获取结果在主线程中,是会阻塞主线程的。但是如果通过ListenableFuture,那么获取结果也是新开线程,并不阻塞主线程。适用的场景是多个任务并发计算,某个任务的计算时间特别长。举例如下
A 直接在主线程获取结果并处理,耗时512ms

B 使用ListenableFuture,耗时14ms

网友评论