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

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

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

1.Optional 创建实例

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

2.Optional查询引用

常用方法 描述
boolean isPresent() 包含的引用非null的(引用存在),返回true
T get() 返回包含的内容,则抛出java.lang.IllegalStateException
T or(T) 返回包含的内容,如果为空,则返回指定的值
T orNull 返回包含的内容,如果为空,则返回null
Set asSet() 如果引用存在,返回只有单一元素的集合;如果引用缺失,返回空集合。
Optional transform() 引用存在,则它被转换给定的功能;否则absent()被返回。
Iterable 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

【Guava】Optional接口来避免空指针错误的更多相关文章

  1. Jdk14都要出了,还不能使用 Optional优雅的处理空指针?

    1. 前言 如果你没有处理过空指针,那么你不是一位真正的 Java 程序员. 空指针确实会产生很多问题,我们经常遇到空的引用,然后又想从这个空的引用上去获取其他的值,接着理所当然的碰到了 NullPo ...

  2. Tomcat8.5配置https启动报空指针错误

    tomcat8.5版本和tomcat8.0有了很大的区别,默认的server.xml中https的配置方式也有了变化: <Connector port="8443" prot ...

  3. [saiku] 连接 mondrain 数据源出错-空指针错误

    我的个亲娘,这个问题查半天终于查出来了. 一开始以为是配置的mysql的location连接有问题,各种修改啊各种尝试,还是不行. 好死不死报了空指针错误,让人无法下手. 后来发现是这样子的: 生成s ...

  4. ViewPager空指针错误,android.support.v4.view.ViewPager.onSaveInstanceState

    support.v4 包为我们提供了一个非常实用的滑动控件ViewPager,在使用ViewPager时有一个需要注意的地方: 即: android.support.v4.view.ViewPager ...

  5. 空指针错误 java.lang.NullPointerException

    使用基本的JAVA数据类型,变量的值要么已经是默认值,如果没有对其正常赋值,程序便 不能通过编译,因此使用基本的JAVA数据类型(double,float,boolean,char,int,long) ...

  6. NIO SelectionKey attachment()空指针错误

    Channel注册到Selector时添加了一个Object: serverSocketChannel1.register(selector, SelectionKey.OP_ACCEPT, num[ ...

  7. 切记切记:Spring配置文件中,Component-scan无法扫描到的类中的自动装配对象无法被调用,报空指针错误。

    Spring单例注入,单例对象可设置成Spring元件. 只有Spring的元件中@Autowired才有用,在普通类中@Autowired虽然不会编译报错,但运行时会报空指针错误.

  8. unity_实用小技巧(空指针错误)

    在游戏开发中,空指针错误是我们最常见也是最容易出现的错误.下面介绍一下博主近期遇见的空指针错误 如上图,有两个类,如果此时我们在图2中调用图1的单例模式可能会出现空指针错误. 原因在于:编译器可能先执 ...

  9. Java8 Optional && Guava Optional

    Java8 -- Optional boolean isPresent():与obj != null()一样:调用get()前要调用isPresent()检查,不然会报错 Optional的三种构造方 ...

随机推荐

  1. 布局分析002:入门级的CSS导航弹出菜单

    这种弹出菜单非常有意思,也有记录的意义,甚至可以说,掌握了这种弹出菜单,基本上CSS掌握的差不多. 主要涉及下面三个重要知识: CSS的继承性质. relative absolute定位. 子选择符& ...

  2. canvas里调用getImageData的报security的问题

    canvas元素支持绘制任意图片元素: var ctx = document.getElementById("canvas").getContext("2d") ...

  3. D3 datum()

    datum()和data()功能类似. datum():将指定数据赋值给被选择元素.data():将数据数组与选择集的元素结合. var p = d3.selectAll('p'); p.datum( ...

  4. TSQL--逻辑查询处理

    1. 查询处理可分成逻辑处理和物理处理,逻辑处理上各阶段有特定的顺序,但为优化查询,在保证结果集正确的条件下,物理处理顺序并不按照逻辑处理顺序执行,如果在INNER JOIN时,WHERE语句中的过滤 ...

  5. Visual Studio for mac从入门到放弃1

    MAC  第一步:从微软官网下载:https://www.visualstudio.com/vs/visual-studio-mac/ 第二步:安装软件过程出现 It was not possible ...

  6. 深入理解js立即执行函数

    看过jQuery源码的人应该知道,jQuery开篇用的就是立即执行函数.立即执行函数常用于第三方库,好处在于隔离作用域,任何一个第三方库都会存在大量的变量和函数,为了避免变量污染(命名冲突),开发者们 ...

  7. java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String;

    问题描述:在eclipse3.7中启动tomcat6时一直出现这个错误, java.lang.NoSuchMethodError: javax.servlet.ServletContext.getCo ...

  8. 基于SSH的客户关系管理系统CRM-JavaWeb项目-有源码

    开发工具:Myeclipse/Eclipse + MySQL + Tomcat 项目简介: 项目的编译和运行:1 将数据库导入MysSql里 :打开HeidiSql这个图形化工具,新建一个数据库, 可 ...

  9. Syncthing源码解析 - 源码目录说明!

    Syncthing是一个免费开源的p2p软件,Go语言编写的! 官网:https://syncthing.net/ 源码:https://github.com/syncthing/syncthing/ ...

  10. JZOJ6096 森林

    题目传送门 Description ​我们定义对一棵树做一次变换的含义为:当以 1 号节点为根时,交换两个互相不为祖先的点的子树: ​一棵树的权值为对它进行至多一次变换能得到的最大直径长度: ​初始时 ...