一、聊聊NullPointerException

  相比做Java开发的,见到NullPointerException肯定不陌生吧,可以说见到它深恶痛绝。在开发时认为不会出现NullPointerException异常,最终到了生产环境,就给你来点意外惊喜。但是在开发时处理对象为空的通常都是用if(null != xxx),或者使用一些工具类,比如:if(ObjectUtils.isEmpty(xxx)),可以看出这种处理会让我们的代码变得很臃肿,遇到一个对象时可能都要这样来一下。

  使用Optional类就可以避免在程序中使用一堆的if来处理空了。下表列出Optional类中的方法:

方法名 描述
empty 返回一个空的Optional实例
of 将指定值用Optional封装后返回,如果值为null,则抛出NullPointerException异常
ofNullable 将指定值用Optional封装后返回,如果值为null,则返回空的Optional对象
get 如果值存在,则返回该值,否则抛出NullPointerException异常
isPresent 检查值是否存在,存在返回true,否则返回false
ifPresent 如果值存在,就执行使用该值的方法调用,否则什么都不做
filter 如果值存在并且满足提供的谓词,就返回包含该值的Optional对象,否则返回空的Optional对象
map 如果值存在,就对该值执行提供的mapping函数调用
flatMap 如果值存在,就对该值执行提供的mapping函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象
orElse 如果值存在就将其返回,否则返回指定的的值
orElseGet 如果值存在就将其返回,否则返回由指定的Supplier接口生成的值
orElseThrow 如果值存在就将其返回,否则抛出由指定的Supplier接口生成的异常

下面就一一来详细使用上面列出的方法。

二、使用Optional类

2.1 empty

Optional<User> user = Optional.empty();

创建一个空的Optional对象

2.2 of

User user = null;
Optional<User> optional = Optional.of(user);

user为空,直接报NullPointerException异常,因此该方法一般很少用。

2.3 ofNullable

User user = null;
Optional<User> optional = Optional.ofNullable(user);

user为空,则返回空的Optional对象

2.4 get

User user = null;
Optional<User> optional = Optional.ofNullable(user);
optional.get();

Optional中获取值,如果值不存在则抛出如下异常:java.util.NoSuchElementException: No value present

2.5 isPresent

User user = null;
Optional<User> optional = Optional.ofNullable(user);
optional.isPresent();

以上例子返回false,如果user不为空,则返回true

2.6 ifPresent

User user = null;
Optional<User> optional = Optional.ofNullable(user);
optional.ifPresent(us->{
//user不为空,执行
});

2.7 filter

User user = new User();
user.setName("小A");
boolean result = Optional.ofNullable(user).filter(us -> "小A".equals(us.getName())).isPresent();

如果用户名为小A,则返回true,否则返回false

2.8 map

User user = new User();
user.setName("小A");
String name = Optional.ofNullable(user).map(User::getName).get();

如果user不为空,则抽取name属性,使用get()获取。这里如果name为空,则会报异常,因此通常都是指定默认值或使用自定义异常抛出。

String name = Optional.ofNullable(user).map(User::getName).orElse("");

String name = Optional.ofNullable(user)
.map(User::getName)
.orElseThrow(()->new RuntimeException("用户名不能为空"));

2.9 flatMap

该方法一般用于从类中获取其他类的中某个属性,比如一个班级里面有学生,学生里面有地址,现在需要获取这个班级下的某个学生的地址,按之前的写法:

Address address = new Address();
address.setAddr("天河区"); Student student = new Student();
student.setName("小A");
student.setAddress(address); Grade grade = new Grade();
grade.setName("三年级2班");
grade.setStudent(student); if(!ObjectUtils.isEmpty(grade)){
Student student1 = grade.getStudent();
if(!ObjectUtils.isEmpty(student1)){
Address address1 = student1.getAddress();
if(!ObjectUtils.isEmpty(address1)){
System.out.println(address1.getAddr());
}
}
}

为了程序不出问题,就会写一大堆的if来判断,下面用flatMap来看下怎么实现:

Optional.ofNullable(grade)
.flatMap(g->Optional.ofNullable(g.getStudent()))
.flatMap(s->Optional.ofNullable(s.getAddress()))
.map(Address::getAddr)
.orElse("")

Optional.ofNullable(grade)
.map(Grade::getStudent)
.map(Student::getAddress)
.map(Address::getAddr)
.orElse("")

2.10 orElse

Optional.ofNullable(grade).orElse(new Grade());

2.11 orElseGet

Optional.ofNullable(grade).orElseGet(()->new Grade());

2.12 orElseThrow

Optional.ofNullable(grade).orElseThrow(()->new RuntimeException("班级不能为空"));

以上Optional类的全部方法的使用都列出来了。

使用Optional处理null的更多相关文章

  1. JDK8新特性:使用Optional避免null导致的NullPointerException

    空指针异常是导致Java应用程序失败的最常见原因.以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写 ...

  2. Java8之使用Optional进行Null处理

    Optional类这是Java 8新增的一个类,用以解决程序中常见的NullPointerException异常问题,本篇文章将详细介绍Optional类,以及如何用它消除代码中的null检查. 1. ...

  3. 用optional取代null

    Java8引入了java.util.Optional<T>,它是一个封装的Optional值的类.变量存在时,Optional类只是对类简单封装.变量不存在时,缺失的值会被建模成一个空的O ...

  4. Java8:使用 Optional 处理 null

    写过 Java 程序的同学,一般都遇到过 NullPointerException :) —— 为了不抛出这个异常,我们便会写如下的代码: User user = getUserById(id); i ...

  5. Java 8 (9) Optional取代null

    NullPointerException,大家应该都见过.这是Tony Hoare在设计ALGOL W语言时提出的null引用的想法,他的设计初衷是想通过编译器的自动检测机制,确保所有使用引用的地方都 ...

  6. 《Java 8 in Action》Chapter 10:用Optional取代null

    1965年,英国一位名为Tony Hoare的计算机科学家在设计ALGOL W语言时提出了null引用的想法.ALGOL W是第一批在堆上分配记录的类型语言之一.Hoare选择null引用这种方式,& ...

  7. java8 用Optional取代null

    如何处理null 怎样做才能避免不期而至的NullPointerException呢?通常,可以在需要的地方添加null的检查(过于激进的防御式检查甚至会在不太需要的地方添加检测代码),并且添加的方式 ...

  8. Guava学习笔记(1):Optional优雅的使用null

    转自:http://www.cnblogs.com/peida/archive/2013/06/14/Guava_Optional.html 参考:[Google Guava] 1.1-使用和避免nu ...

  9. Optional优雅的使用null

    在我们学习和使用Guava的Optional之前,我们需要来了解一下Java中null.因为,只有我们深入的了解了null的相关知识,我们才能更加深入体会领悟到Guava的Optional设计和使用上 ...

随机推荐

  1. 下载微软pdb符号文件

    使用symchk.exe  逐层下载c:\windows\system32下的pdb文件 symchk /r c:\windows\system32 /s SRV*D:\mypdb\*http://m ...

  2. Python基础之:Python中的IO

    目录 简介 linux输入输出 格式化输出 f格式化 format格式化 repr和str %格式化方法 读写文件 文件对象的方法 使用json 简介 IO就是输入和输出,任何一个程序如果和外部希望有 ...

  3. java例题_22 用递归求阶乘 5!

    1 /*22 [程序 22 递归求阶乘] 2 题目:利用递归方法求 5!. 3 程序分析:递归公式:fn!=fn*4! 4 */ 5 6 /*分析 7 * 递归:如果其中每一步都要用到前一步或前几步的 ...

  4. List集合中的交集 并集和差集

    目录 List集合求交集 并集 差集 Set集合 Lambda表达式 List集合求交集 并集 差集 两种方法求集 Set集合 交集 两个集合中有相同的元素 抽取出来的数据就是为交集 @Test pu ...

  5. 【算法笔记】二分图与KM算法(当你试图只看蓝书学算法

    前言 呜,好久没写博客了,DDL 也有好多,一不留神就轮到我了呜. 看了一眼其它同学写的博客,什么数模啊,什么 CTF 啊,什么 Python 爬虫啊,感觉自己真是越来越菜了呜. 然后在我一愁莫展之际 ...

  6. 又一起.NET程序挂死, 用 Windbg 抽丝剥茧式的真实案例分析

    一:背景 1. 讲故事 前天有位粉丝朋友在后台留言让我帮忙看看他的 Winform程序 UI无响应 + 410线程 到底是啥情况,如下图: 说实话,能看到这些真实案例我是特别喜欢的 ,就像医生看病,光 ...

  7. hibernate的三种查询方式

    hibernate的三种查询方式 目录 hibernate的三种查询方式 1.HQL查询 1.1.SQL概述 1.2.实体查询 1.3.带where的查询 1.3.属性查询 1.4.实体的更新和删除 ...

  8. 大一那会,我用QQ远程帮同学考过计算机二级

    考证 大一那会儿流行考证,什么普通话.教师资格证.计算机.商务英语各种证五花八门的. 我们非计算机专业(我是通信工程)的基本上都会去考一个叫计算机二级的证书,说是找工作有用,大一新生,哪懂这些,一窝蜂 ...

  9. Netty 框架学习 —— 第一个 Netty 应用

    概述 在本文,我们将编写一个基于 Netty 实现的客户端和服务端应用程序,相信通过学习该示例,一定能更全面的理解 Netty API 该图展示的是多个客户端同时连接到一台服务器.客户端建立一个连接后 ...

  10. php将IP地址转换为真实地址的方法

    方法使用示例如下 define('WEB_ROOT',dirname(__FILE__)); echo convertip('111.63.244.69','full'); func converti ...