博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Guava API学习之Optional 判断对象是否为null
阅读量:4150 次
发布时间:2019-05-25

本文共 1667 字,大约阅读时间需要 5 分钟。

 

java.lang.NullPointerException,只要敢自称Java程序员,那对这个异常就再熟悉不过了。为了防止抛出这个异常,我们经常会写出这样的代码:

Person person = people.find("John Smith");if (person != null) { person.doSomething();}

 

 在Java世界里,解决空引用问题常见的一种办法是,使用Null Object模式。这样的话,在“没有什么”的情况下,就返回Null Object,客户端代码就不用判断是否为空了。但是,这种做法也有一些问题。首先,我们肯定要为Null Object编写代码,而且,如果我们想大规模应用这个模式,我们要为几乎每个类编写Null Object。

 

幸好,我们还有另外一种选择:Optional。Optional是对可以为空的对象进行的封装,它实现起来并不复杂。在某些语言里,比如 Scala,Optional实现成了语言的一部分。而对于Java程序员而言,Guava为我们提供了Optional的支持。闲言少叙,先来如何使用 Optional,完成前面的那段代码

Optional person = people.find("John Smith");if (person.isPresent()) { person.get().doSomething();}

 

这里如果isPresent()返回false,说明这是个空对象,否则,我们就可以把其中的内容取出来做自己想做的操作了。

如果你期待的是代码量的减少,恐怕这里要让你失望了。单从代码量上来说,Optional甚至比原来的代码还多。但好处在于,你绝对不会忘记判空,因为这里我们得到的不是Person类的对象,而是Optional。

看完了客户端代码,我们再来看看怎样创建一个Optional对象,基本的规则很简单:

如果我们知道自己要封装的对象是一个空对象,可以用

Optional.absent();

如果封装的对象是一个非空对象,则可以用

Optional.of(obj);

如果不知道对象是否为空,就这样创建创建

Optional.fromNullable(obj);

有时候,当一个对象为null的时候,我们并不是简单的忽略,而是给出一个缺省值,比如找不到这个人,任务就交给经理来做。使用Optional可以很容易地做到这一点,以上面的代码为例:

Optional person = people.find("John Smith");  person.or(manager).doSomething()

说白了,Optinal是给了我们一个更有意义的“空”。

 

简单使用实例:

Student student = new Student();		String name = student.getName();		Optional
optional = Optional.fromNullable(name); if (optional.isPresent()) { System.out.println("name : " + name); }else { System.out.println("null ........"); student.setName("sungang"); } name = student.getName(); optional = Optional.fromNullable(name); if (optional.isPresent()) { System.out.println("name : " + name); }else { System.out.println("null ........"); student.setName("sungang");}

 

结果:

null ........name : sungang

 

转载地址:http://dplti.baihongyu.com/

你可能感兴趣的文章
XML生成(三):JDOM生成
查看>>
Ubuntu Could not open lock file /var/lib/dpkg/lock - open (13:Permission denied)
查看>>
collect2: ld returned 1 exit status
查看>>
C#入门
查看>>
C#中ColorDialog需点两次确定才会退出的问题
查看>>
数据库
查看>>
nginx反代 499 502 bad gateway 和timeout
查看>>
linux虚拟机安装tar.gz版jdk步骤详解
查看>>
python实现100以内自然数之和,偶数之和
查看>>
去哪儿一面+平安科技二面+hr面+贝贝一面+二面产品面经
查看>>
C++ 调用json
查看>>
动态库调动态库
查看>>
Kubernetes集群搭建之CNI-Flanneld部署篇
查看>>
k8s web终端连接工具
查看>>
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
手绘VS码绘(二):动态图绘制(码绘使用Processing)
查看>>
《达芬奇的人生密码》观后感
查看>>
基于“分形”编写的交互应用
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>