一、引子

Guava的经典很大一部分原因来源于对于基础工具类的封装,使用这些类能够让我们的代码更加优雅且完善,这些类大部分都在com.google.common.base包下。

注:JDK有很多借鉴guava的地方,本文只讲解guava,如果jdk中有类似的实现,不必疑虑。

二、基本工具

按照官网介绍,Guava base包下有一些经典工具,如下:

2.1 Optional<T>

1.作用

在构造对象的时候就明确申明该对象是否可能为null,快速失败拒绝null值,可以避免空指针异常。

2.简单使用

 /**
* @Description Optional:一个指向值对象引用的对象实例,使得构造对象时就明确申明是否支持null
* @author denny
* @date 2018/7/24 下午2:23
*/
public class OptionalTest {
public static void main(String[] args) {
Integer a = null;
Integer b = 1;
// 支持null、非null
Optional<Integer> optionalA1 = Optional.fromNullable(a);
Optional<Integer> optionalA2 = Optional.fromNullable(b);
// 不支持null,参数为null报错
Optional<Integer> optionalB = Optional.of(b);
// 不包含引用对象的实例()
Optional<Integer> optionalC = Optional.absent(); // 不存在实例,不进入
if(optionalA1.isPresent()){
System.out.println(" A1 get="+optionalA1.get());
}
// 存在实例,进入
if(optionalA2.isPresent()){
System.out.println(" A2 get="+optionalA2.get());
}
// 存在实例,进入
if(optionalB.isPresent()){
System.out.println(" B get="+optionalB.get());
}
// 不存在实例,不进入
if(optionalC.isPresent()){
System.out.println(" C get="+optionalC.get());
} }
}

结果如下:

 A2 get=1
B get=1

2.2 Preconditions

1.作用

前置条件校验,让方法中的条件检查更简单。

2.简单使用

 /**
* @Description 前置条件校验
* @author denny
* @date 2018/7/24 下午3:14
*/
public class PreconditionsTest {
public static void main(String[] args) { /** 1.空指针校验 */
Integer a = null;
// 直接抛出空指针异常
Preconditions.checkNotNull(a);
// 抛出指定错误消息的空指针异常
Preconditions.checkNotNull(a,"a is null!");
// 抛出指定错误消息(指定参数替换掉%s)的空指针异常
Preconditions.checkNotNull(a,"a is null ,a=%s",a); /** 2.方法入参校验 */
// 方法入参校验:校验第一参是否true
Preconditions.checkArgument(a!=null && a>=0,"参数a不满足条件! a=%s",a); /** 3.检查对象的状态 */
// 模拟:订单号作为方法入参,修改订单状态为已完成。
Order order = Order.builder().id(1).build();
// 状态校验,非入参校验
Preconditions.checkState(order.getState()>0,"订单状态非法! status=%s",order.getState()); /** 4.下标越界校验 */
List list = Lists.newArrayList(1,2,3);
//Preconditions.checkElementIndex(5,list.size(),"下标非法!"); /** 5.下标越界、start<end 校验 */
Preconditions.checkPositionIndexes(0,5,list.size());
}
}

2.3 Objects(JDK7以上直接使用java.util.Objects)

1.作用

常见Object方法,简化Object方法实现,如hashCode()和toString()。

2.简单使用

4个典型方法:

equal、hashcode、toString、compare/compareTo

 /**
* @Description 简化对象的一些方法
* @author denny
* @date 2018/7/24 下午4:08
*/
public class ObjectsTest {
public static void main(String[] args) {
/** 1.equals */
//false
System.out.println(Objects.equal("a",null));
System.out.println(Objects.equal("a","b"));
// true
System.out.println(Objects.equal("a","a"));
System.out.println(Objects.equal(null,null)); /** 2.hashCode */
Order order1 = Order.builder().id(1).state(2).build();
Order order2 = Order.builder().id(2).state(1).build();
System.out.println(Objects.hashCode(order1,order2)); /** 2.toString */
String str = MoreObjects.toStringHelper(order1).add("x",1).toString();
System.out.println(str); /** 2.compare/compareTo */
// 这里比较订单大小,比较顺序:id,状态,即先比较ID再比较状态,有一个不相等就立即返回结果
int result = ComparisonChain.start()
.compare(order1.getId(),order2.getId())
.compare(order1.getState(),order2.getState())
.result();
System.out.println(result);
}
}

打印结果:

 false
false
true
true
114363
Order{x=1}
-1

2.4 Ordering<T>(JDK8建议直接使用Stream,Comparator)

1.作用

排序,”流式风格比较器”。支持多重排序,并使用到集合中。这个类不在base包下,在collect包下.可能考虑到集合中元素排序吧...

2.简单使用

reverse() :获取语义相反的排序器
nullsFirst():null值排到最前面。
nullsLast():null值排到最后面。
compound(Comparator):合成另一个比较器,以处理当前排序器中的相等情况。
lexicographical():基于处理类型T的排序器,返回该类型的可迭代对象Iterable<T>的排序器。
onResultOf(Function):对集合中元素调用Function,再按返回值用当前排序器排序。

 package guava.base;

 import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import guava.base.domain.Order; import java.util.List; /**
* @Description 排序
* @author denny
* @date 2018/7/24 下午6:01
*/
public class OrderingTest {
public static void main(String[] args) {
/**自然排序: 数字升序,时间升序*/
// 简单数据排序
Ordering<Integer> integerOrdering = Ordering.natural().nullsFirst();
List<Integer> list = Lists.newArrayList(1,3,null,5,4,2);
// 自然排序,空前置
System.out.println("1.自然排序:"+integerOrdering.sortedCopy(list));
System.out.println("2.自然反转排序:"+integerOrdering.reverse().sortedCopy(list)); // 根据apply返回值排序
Ordering<Order> orderOrdering = Ordering.natural().onResultOf(new Function<Order, Integer>() {
public Integer apply(Order order){
/* 订单ID自然排序 */
return order.getId();
}
});
List<Order> orders = Lists.newArrayList(new Order(1,0),new Order(3,1),new Order(2,2));
System.out.println("3.根据订单ID自然排序:"+orderOrdering.sortedCopy(orders));
System.out.println("4.根据订单ID自然排序,求最大值:"+orderOrdering.max(orders));
System.out.println("5.根据订单ID自然排序,求最小值:"+orderOrdering.min(orders));
System.out.println("6.求ID最小的k个元素:"+orderOrdering.leastOf(orders,2));
System.out.println("7.求ID最大的k个元素:"+orderOrdering.greatestOf(orders,2));
}
}

结果如下:

1.自然排序:[null, 1, 2, 3, 4, 5]
2.自然反转排序:[5, 4, 3, 2, 1, null]
3.根据订单ID自然排序:[Order(id=1, state=0), Order(id=2, state=2), Order(id=3, state=1)]
4.根据订单ID自然排序,求最大值:Order(id=3, state=1)
5.根据订单ID自然排序,求最小值:Order(id=1, state=0)
6.求ID最小的k个元素:[Order(id=1, state=0), Order(id=2, state=2)]
7.求ID最大的k个元素:[Order(id=3, state=1), Order(id=2, state=2)]

2.5 Throwables(不推荐使用)

1.作用

异常支持,简化了异常和错误的传播与检查。

2.简单使用

目前JDK7已经是比较老的版本了,JDK7自带多重捕获,7以及以上都不推荐使用Throwables,这里就不写使用了。

三、总结

guava虽然很经典,但是因为JDK一直在迭代完善,当JDK中有的东西时,建议就不要用guava了。基础工具中,Optional和Preconditions还是可以用用,其它的也就那样了,各位自己看着用吧,当然作为基础工具,想要看guava源码还是有必要了解下知道是干嘛的。

==参考==

Guava Github User Guide

Guava 2:Basic utilities基本工具的更多相关文章

  1. [Google Guava] 2.4-集合扩展工具类

    原文链接 译文链接 译者:沈义扬,校对:丁一 简介 有时候你需要实现自己的集合扩展.也许你想要在元素被添加到列表时增加特定的行为,或者你想实现一个Iterable,其底层实际上是遍历数据库查询的结果集 ...

  2. [Guava学习笔记]Basic Utilities: Null, 前置条件, Object方法, 排序, 异常

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3842433.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  3. [Guava源代码阅读笔记]-Basic Utilities篇-1

    欢迎訪问:个人博客 写该系列文章的目的是记录Guava源代码中个人感觉不错且值得借鉴的内容. 一.MoreObjects类 //MoreObjects.ToStringHelper类的toString ...

  4. Guava库介绍之实用工具类

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...

  5. MySQL Utilities管理工具

    前提: 1.安装MySQL Utilities工具 2.复制my_print_defaults命令至/usr/bin下或写入环境变量. 卸载方式: python ./setup.py clean -- ...

  6. (5.6)mysql高可用系列——MySQL Utilities 管理工具

    关键词:mysql工具集,mysql管理工具,mysql utilities [1]安装mysql utilities cd /download wget https://cdn.mysql.com/ ...

  7. [Guava学习笔记]Collections: 集合工具类

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3861431.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  8. [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具

    原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...

  9. Guava 开源工具的简单介绍

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...

随机推荐

  1. (18)ProcessPoolExecutor进程池

    # 新版本的进程池 ProcessPoolExecutor # 实例化进程池 ProcessPoolExcutor(cpu_count) # 异步提交任务 submit / map # 阻塞直到任务完 ...

  2. spring 配置Value常量(不支持到static上)

    spring 配置Value常量(不支持到static上) 看代码吧,语言表达有问题. package com.variflight.xzair.rest.constant; import org.s ...

  3. 七天学会ASP.NET MVC ——深入理解ASP.NET MVC

    七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC   系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二) ...

  4. 每天跟着书敲Mysql

    要深入学下Mysql操作啦 CRUD,create,retrieve,update,delete

  5. openLDAP安装时无法操作根节点数据,提示的是This base cannot be created with PLA.

    1.无法操作根节点数据,提示的是This base cannot be created with PLA. 解决办法 1)添加一个base.ldif文件,里面的dc和配置文件里的保持一致即可 dn: ...

  6. Java中如何设置表格处于不可编辑状态

    代码片段如下: 这样的话就可以将表格设置为不可编辑状态

  7. 网络(socket)编程

    一.网络协议 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构(互联网中处处是C/S架构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器 C/S架构与socket的关系: ...

  8. Linux 服务器中木马及木马清除

    1.查看流量图发现问题 查看的时候网页非常卡,有的时候甚至没有响应 2.top动态查看进程 我马上远程登录出问题的服务器,远程操作很卡,网卡出去的流量非常大,通过top发现了一个异常的进程占用资源比较 ...

  9. 关于vs调用数据库存储过程 返回输出参数的一些总结

    1.直接上练习的存储过程,方便回想 create proc proc_output @totlecount int output, @pageIndex int, @pageSize intas de ...

  10. SqlServer根据表中ID加序号

    正序列号select ROW_NUMBER() over(order by Id) as xh,Id,Name,TelNumber,Zhijin from Users1 反序列号select 序号=( ...