文档章节

【Guava】Optional接口来避免空指针错误

端木轩
 端木轩
发布于 2017/08/22 09:10
字数 523
阅读 17
收藏 0

null会带来很多问题,从开始有null开始有无数程序栽在null的手里,null的含义是不清晰的,检查null在大多数情况下是不得不做的,而我们又在很多时候忘记了对null做检查,在我们的产品真正投入使用的时候,空指针异常出现了,这是一种讨厌的情况。

鉴于此google的guava库中提供了Optional接口来使null快速失败,即在可能为null的对象上做了一层封装,在使用Optional静态方法of时,如果传入的参数为null就抛出NullPointerException异常。

使用Optional<T>除了简化粗鲁的if(null == object)、降低函数的复杂度、增加可读性之外,它是一种傻瓜式的防护,Optional<T>引导编码人员主动的思考引用为null的情况。

1.Optional<T> 创建实例

创建实例 描述
Optional.of(T) 若引用为null则快速失败,抛出异常 java.lang.NullPointerException
Optional.absent() 创建引用缺失的Optional实例
Optional.fromNullable(T) 引用为null则表示缺失

2.Optional<T>查询引用

常用方法 描述
boolean isPresent() 包含的引用非null的(引用存在),返回true
T get() 返回包含的内容,则抛出java.lang.IllegalStateException
T or(T) 返回包含的内容,如果为空,则返回指定的值
T orNull 返回包含的内容,如果为空,则返回null
Set<T> asSet() 如果引用存在,返回只有单一元素的集合;如果引用缺失,返回空集合。
<V> Optional<V> transform() 引用存在,则它被转换给定的功能;否则absent()被返回。
<T> Iterable<T> presentInstances(Iterable<? extends Optional<? extends T>> optionals) 将参数optionals中为null的optional剔除,同时返回值对象的Iterable

3.代码示例

1.基本用法

Optional<Integer> possible = Optional.fromNullable(5);//创建允许null值的Optional
System.out.println(possible.isPresent());
System.out.println(possible.get());            // 5
System.out.println(possible.or(3));            // 5
System.out.println(possible.orNull());        // 5
System.out.println(possible.asSet());        // [5]

2.presentInstances

List<Optional<Integer>> list = new ArrayList<>();
for (int index = 10; index > 0; --index) {
    Integer t;
    if (0 == index % 2) {
        t = index;
    } else {
        t = null;
    }
    list.add(Optional.fromNullable(t));
}
Iterable<Integer> it = Optional.presentInstances(list);
it.forEach(System.err::println);

//输出结果为:
//10
//8
//6
//4
//2

本文转载自:

端木轩
粉丝 9
博文 46
码字总数 52646
作品 0
杭州
高级程序员
私信 提问
Java 8th 新特性:Optional类

Java 8th 新特性系列 Java 8th 新特性(一):lambda表达式 Java 8th 新特性(二):Optional类 Java 8th 新特性(三):流式数据处理 Java 8th 新特性(四):默认接口方法 待定 NullPointE...

zhenchao
2016/09/24
1K
8
elastic-job 源码解读之从源码看null值

在elastic-Job作业启动的时候,首先会去持久化LiteJob的配置信息,持久化保存之前先去会检查job存不存在,读取zk上的原有配置的job信息,如果节点不存在,或者需要重写的时候,去注册中心写节...

一滴水的坚持
2017/11/22
0
0
google guava基本操作认识 二

避免空指针 "Null sucks." -Doug Lea "I call it my billion-dollar mistake." - Sir C. A. R. Hoare, on his invention of the null reference 1 粗心使用了null导致了很多bug ,迅速失败而不......

writeademo
2018/11/26
16
0
使用Java 8 Optional避免空指针异常

Optional可以让你的代码具有可读性,且会避免出现空指针异常。 都说没有遇到过空指针异常的程序员不是Java程序员,确实引发过很多问题。Java 8中引入了一个叫做的新类可以避免引起的诸多问...

刘亚涛
2018/01/11
5K
32
java8特性之Optional

java8特性之Optional optional是一个用来隐式进行非空检测的一个容器,不需要显式的进行null之判断 构造函数全部私有化,所以提供了3个静态公开的方法进行optional的初始化,下来我们学习一下...

貔貅叔
2018/12/24
35
1

没有更多内容

加载失败,请刷新页面

加载更多

安全组和云防火墙的区别

前言 熟悉云平台的朋友可能都会注意到这样一个事情:无论公有云还是私有云,创建虚拟机的时候都需要选择安全组,来对虚拟机进行安全防护;有的云平台在VPC里,还能选择防火墙,ZStack在3.6版...

ZStack社区版
26分钟前
2
0
教育性app开发的重要性和好处

在这个精通技术的世界中,流行的app主导着无聊的教育系统。当我们将技术和教育结合在一起时,它将带来当代以及强大的学习资源。因此,将教育移动app集成到您的学习过程中,并根据自己的信念把...

a429011717
27分钟前
3
0
IE6/7/8如何兼容CSS3属性

本文转载于:专业的前端网站➩IE6/7/8如何兼容CSS3属性 最近在工作中总是要求IE8兼容CSS3属性,在网上搜了搜主要是引入了一个htc文件(ie-css3.htc或者PIE.htc。个人认为这两个文件的作用差不...

前端老手
42分钟前
3
0
手把手教你ALLEGRO的约束规则的设置教程!

约束规则的设置 分三步, 定义规则(一、基本约束规则设置:1、线间距设置;2、线宽设置;3、设置过孔;4、区域约束规则设置;5、设置阻抗;6、设置走线的长度范围;7、设置等长:7.1、不过电阻的NET 等...

demyar
44分钟前
4
0
完美解决H5滚动滑动穿透方案:不使用系统滚动

网上有很多黑科技解决这个问题,都不是从根本去解决,例如通过js控制弹出时html加上position:fixed; 弹窗关闭后再去掉该样式,总觉得不太对,像是打补丁。 今天终于找到了滚动穿透的原因和完...

未来cc
49分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部