关键词:
一、引子
Guava的经典很大一部分原因来源于对于基础工具类的封装,使用这些类能够让我们的代码更加优雅且完善,这些类大部分都在com.google.common.base包下。
注:JDK有很多借鉴guava的地方,本文只讲解guava,如果jdk中有相同的想法,不必疑虑。
二、基本工具
按照官网介绍,Guava base包下有一些经典工具,如下:
2.1 Optional<T>
1.作用
在构造对象的时候就明确申明该对象是否可能为null,快速失败拒绝null值,可以避免空指针异常。
2.简单使用
1 /** 2 * @Description Optional:一个指向值对象引用的对象实例,使得构造对象时就明确申明是否支持null 3 * @author denny 4 * @date 2018/7/24 下午2:23 5 */ 6 public class OptionalTest 7 public static void main(String[] args) 8 Integer a = null; 9 Integer b = 1; 10 // 支持null、非null 11 Optional<Integer> optionalA1 = Optional.fromNullable(a); 12 Optional<Integer> optionalA2 = Optional.fromNullable(b); 13 // 不支持null,参数为null报错 14 Optional<Integer> optionalB = Optional.of(b); 15 // 不包含引用对象的实例() 16 Optional<Integer> optionalC = Optional.absent(); 17 18 // 不存在实例,不进入 19 if(optionalA1.isPresent()) 20 System.out.println(" A1 get="+optionalA1.get()); 21 22 // 存在实例,进入 23 if(optionalA2.isPresent()) 24 System.out.println(" A2 get="+optionalA2.get()); 25 26 // 存在实例,进入 27 if(optionalB.isPresent()) 28 System.out.println(" B get="+optionalB.get()); 29 30 // 不存在实例,不进入 31 if(optionalC.isPresent()) 32 System.out.println(" C get="+optionalC.get()); 33 34 35 36
结果如下:
A2 get=1
B get=1
2.2 Preconditions
1.作用
前置条件校验,让方法中的条件检查更简单。
2.简单使用
1 /** 2 * @Description 前置条件校验 3 * @author denny 4 * @date 2018/7/24 下午3:14 5 */ 6 public class PreconditionsTest 7 public static void main(String[] args) 8 9 /** 1.空指针校验 */ 10 Integer a = null; 11 // 直接抛出空指针异常 12 Preconditions.checkNotNull(a); 13 // 抛出指定错误消息的空指针异常 14 Preconditions.checkNotNull(a,"a is null!"); 15 // 抛出指定错误消息(指定参数替换掉%s)的空指针异常 16 Preconditions.checkNotNull(a,"a is null ,a=%s",a); 17 18 /** 2.方法入参校验 */ 19 // 方法入参校验:校验第一参是否true 20 Preconditions.checkArgument(a!=null && a>=0,"参数a不满足条件! a=%s",a); 21 22 /** 3.检查对象的状态 */ 23 // 模拟:订单号作为方法入参,修改订单状态为已完成。 24 Order order = Order.builder().id(1).build(); 25 // 状态校验,非入参校验 26 Preconditions.checkState(order.getState()>0,"订单状态非法! status=%s",order.getState()); 27 28 /** 4.下标越界校验 */ 29 List list = Lists.newArrayList(1,2,3); 30 //Preconditions.checkElementIndex(5,list.size(),"下标非法!"); 31 32 /** 5.下标越界、start<end 校验 */ 33 Preconditions.checkPositionIndexes(0,5,list.size()); 34 35
2.3 Objects(JDK7以上直接使用java.util.Objects)
1.作用
常见Object方法,简化Object方法实现,如hashCode()和toString()。
2.简单使用
4个典型方法:
equal、hashcode、toString、compare/compareTo
1 /** 2 * @Description 简化对象的一些方法 3 * @author denny 4 * @date 2018/7/24 下午4:08 5 */ 6 public class ObjectsTest 7 public static void main(String[] args) 8 /** 1.equals */ 9 //false 10 System.out.println(Objects.equal("a",null)); 11 System.out.println(Objects.equal("a","b")); 12 // true 13 System.out.println(Objects.equal("a","a")); 14 System.out.println(Objects.equal(null,null)); 15 16 /** 2.hashCode */ 17 Order order1 = Order.builder().id(1).state(2).build(); 18 Order order2 = Order.builder().id(2).state(1).build(); 19 System.out.println(Objects.hashCode(order1,order2)); 20 21 /** 2.toString */ 22 String str = MoreObjects.toStringHelper(order1).add("x",1).toString(); 23 System.out.println(str); 24 25 /** 2.compare/compareTo */ 26 // 这里比较订单大小,比较顺序:id,状态,即先比较ID再比较状态,有一个不相等就立即返回结果 27 int result = ComparisonChain.start() 28 .compare(order1.getId(),order2.getId()) 29 .compare(order1.getState(),order2.getState()) 30 .result(); 31 System.out.println(result); 32 33
打印结果:
1 false 2 false 3 true 4 true 5 114363 6 Orderx=1 7 -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,再按返回值用当前排序器排序。
1 package guava.base; 2 3 import com.google.common.base.Function; 4 import com.google.common.collect.Lists; 5 import com.google.common.collect.Ordering; 6 import guava.base.domain.Order; 7 8 import java.util.List; 9 10 /** 11 * @Description 排序 12 * @author denny 13 * @date 2018/7/24 下午6:01 14 */ 15 public class OrderingTest 16 public static void main(String[] args) 17 /**自然排序: 数字升序,时间升序*/ 18 // 简单数据排序 19 Ordering<Integer> integerOrdering = Ordering.natural().nullsFirst(); 20 List<Integer> list = Lists.newArrayList(1,3,null,5,4,2); 21 // 自然排序,空前置 22 System.out.println("1.自然排序:"+integerOrdering.sortedCopy(list)); 23 System.out.println("2.自然反转排序:"+integerOrdering.reverse().sortedCopy(list)); 24 25 // 根据apply返回值排序 26 Ordering<Order> orderOrdering = Ordering.natural().onResultOf(new Function<Order, Integer>() 27 public Integer apply(Order order) 28 /* 订单ID自然排序 */ 29 return order.getId(); 30 31 ); 32 List<Order> orders = Lists.newArrayList(new Order(1,0),new Order(3,1),new Order(2,2)); 33 System.out.println("3.根据订单ID自然排序:"+orderOrdering.sortedCopy(orders)); 34 System.out.println("4.根据订单ID自然排序,求最大值:"+orderOrdering.max(orders)); 35 System.out.println("5.根据订单ID自然排序,求最小值:"+orderOrdering.min(orders)); 36 System.out.println("6.求ID最小的k个元素:"+orderOrdering.leastOf(orders,2)); 37 System.out.println("7.求ID最大的k个元素:"+orderOrdering.greatestOf(orders,2)); 38 39
结果如下:
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源码还是有必要了解下知道是干嘛的。
==参考==
devcon工具基本使用
根据WDK文档,DevCon工具的基本功能如下;DevConisacommand-linetoolthatperformsthefollowingdevicemanagementfunctionsonlocalandremotecomputers;DevCon是一个命令行工具,在本地或远程计算机上执行设备管理功能;Display 查看详情
powershellboxstarter脚本安装基本的办公工具(代码片段)
python管理git的基本工具(代码片段)
powershellboxstarter脚本安装基本的办公工具(代码片段)
图形化界面工具sqlyog的基本使用
1、安装后连接本地数据库参考:https://blog.csdn.net/qq_41520612/article/details/95474531 2、SQLyog的基本使用 查看详情
mongo可视化工具基本操作
一、可视化工具界面(字段名可以不加引号)二、查询(query)1.日期如:"F1":ISODate("2017-07-26T16:00:00Z")2.条件(>)大于-$gt--------greaterthan(<)小于-$lt--------lessthan(>=)大于等于-$gte---------gtequal(<=)小于等于-$lte---------ltequal 查看详情
markdownfacebook帖子和活动的基本抓取工具(代码片段)
转js模块化工具requirejs教程:基本知识
...的方式引入了requirejs,这一篇将讲述一下requirejs中的一些基本知识,包括API使用方式等。基本APIrequire会定义三个变量:define,require,requirejs,其中require===requirejs,一般使用require更简短define从名字就可以看出这个 查看详情
typora基本使用语法(超好用的代码编辑工具)
Typora代码编辑软件,一款适合新手小白的做笔记工具,操作简单,大家快来看看吧......Typora代码编辑软件,一款适合新手小白的做笔记工具,操作简单,大家快来看看吧...... 查看详情
portainer容器管理工具的基本使用
Portainer容器管理工具的基本使用:https://blog.csdn.net/yuanlingGeGe/article/details/100762360Portainer是一个开源、轻量级Docker管理用户界面,基于DockerAPI,可管理Docker主机或Swarm集群,支持最新版Docker和Swarm模式。Portainer允许您管理Docker容器... 查看详情
jvm监控诊断之工具使用(下篇)(代码片段)
JVM监控诊断工具一、EclipseMAT工具1.基本使用2.主要功能3.注意事项4.内存泄漏(扩展)5.OQL查询语言(扩展)二、JProfiler工具1.基本概述2.主要功能3.安装配置4.基本使用三、Arthas工具1.基本概述2.解决哪些问题3.安装使... 查看详情
ansible自动化运维工具ansible常用模块的基本使用
【Ansible自动化运维工具】Ansible常用模块的基本使用(二)一、检查本地ansible环境1.检查系统版本2.检查ansible版本二、Ansible常用模块的基本使用(一)链接三、ping模块的基本使用四、service模块的基本使用1.service模块介绍2.service... 查看详情
SQL Server 2012 管理工具 - 基本不起作用
】SQLServer2012管理工具-基本不起作用【英文标题】:SQLServer2012ManagementTools-Basicnotworking【发布时间】:2017-08-2517:34:17【问题描述】:我在新计算机上重新安装了SQLServer2012Express和ManagementTools-Basic,但IntegrationServices文件夹中的所有... 查看详情
screw工具基本使用:一键生成java实体类和数据库文档(代码片段)
Screw工具基本使用Screw基本介绍Screw文档生成方式Java方式Maven插件Screw生成JavaPOJO对象Screw基本介绍Screw是一个非常简洁好用的数据库表结构文档生成工具,支持MySQL,Oracle,PostgreSQL等主流的关系数据库Screw数据库表结构文档生成工具支... 查看详情
生物信息基本工具和数据库
生物信息的工具和数据库太多,但有一些基础的工具是必须精通的,甚至需要经常翻阅寻找灵感。 通用数据库:UCSCGenomeBrowser-基因组的可视化OMIM-OnlineMendelianInheritanceinMan-研究疾病必备 专业数据库汇总:单细胞数据库汇... 查看详情
如何在高速公路客户端工具中添加基本身份验证标头
】如何在高速公路客户端工具中添加基本身份验证标头【英文标题】:Howtoaddbasicauthheaderinautobahnclienttool【发布时间】:2013-04-1718:15:55【问题描述】:我想在高速公路客户端工具中添加基本的身份验证标头。我怎样才能做到这一... 查看详情
id基本使用
...有特殊要求,都使用默认。确认之后点击「边距和分栏」基本工具图形工具网格工具吸管工具框架工具图形工具ID中的图形工具,总共有三大种:矩形工具 椭圆工具 多边形工具要注意一下多边形工具,用多边形工具在图形... 查看详情
10个基本的html5动画工具设计
HTML5已经成为最流行的编程语言在web开发者,健壮的编程语言具有产生更好的万维网内容的巨大能力。HTML5的崛起已经在过去三年增长迅速。介绍了HTML5的新技术是远远better.html5技术是由像Chrome的浏览器,支持Firefox、IE和多。今天... 查看详情