

使用Optional更优雅地处理非空判断
source link: https://blog.csdn.net/qq_41973594/article/details/120810204
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

(一)引言
在平常的编码之中,有一个错误总会在你的意料之外出现,那就是空指针异常。空指针的出现也很简单,你得到了一个null对象,调用了一些方法,出现空指针异常。空指针会出现在各种地方,常见的比如Map.get()没有获取到对象就调用对象例的方法,类对象没有获取到就调用类中的方法。
空指针的处理方式也很多,最简单的方式就是用if/else判空,但是这样就会显得代码特别繁琐。这篇文章就带你用JDK8中的Optional来解决空指针异常。
(二)什么是Optional
Optional类是Java 8的新特性,是一个可以为null的容器对象,Optional的使用很简单,介绍几种常用的方法:
Optional.of():传递参数,如果of中的对象是null,就报空指针异常。
Optional<T> optional = Optional.of()
Optional.ofNullable():允许ofNullable传递null对象
Optional<T> optional = Optional.ofNullable();
Optional.empty():返回空的Optional实例
Optional<T> optional = Optional.empty();
optional.isPresent():判断Optional实例是否为空
optional.isPresent()
optional.orElse():如果optional为空的话返回orElse中的对象
optional.orElse()
optional.get():获取optional中的T对象
optional.get();
optional.map():如果optional不为null,则执行map方法中的映射函数得到返回值。
optional.map(Function<? super T,? extends U> mapper)
接下来将会通过实际的代码例子演示Optional在处理Null值上的优势。
(三)Map集合空值判断
集合类型的判空在某些场景下会十分啰嗦,比如我最近刚遇到的一种场景,接收到的Map是这样的:
{"user":{"info":{"address":"hz"}}}
这种时候如果按照常规的写法,需要写多层if语句进行判空
if (map.get("user")!=null){
Map<String,Object> user = (Map<String, Object>) map.get("user");
if (user.get("info")!=null){
Map<String,Object> info = (Map<String, Object>) user.get("info");
if (info.get("address")!=null){
String address = (String) info.get("address");
System.out.println(address);
}
}
}
if里面套着if,结构十分复杂,这个时候我们就可以使用Optional
String address=Optional.ofNullable(map)
.map(m->(Map<String,Object>)m.get("user"))
.map(user->(Map<String,Object>)user.get("info"))
.map(info->(String)info.get("address"))
.orElse(null);
(四)对象类型空指判断
首先构造一下简单的对象:
@Data
public class User {
private UserInfo info;
}
@Data
public class UserInfo {
private String address;
}
给User对象赋予基本的值
User user=new User();
UserInfo userInfo=new UserInfo();
userInfo.setAddress("hz");;
user.setInfo(userInfo);
通常情况下在使用User对象时需要使用多层if/else判空,就像下面这样:
if (user!=null){
UserInfo info = user.getInfo();
if (info!=null){
String address = info.getAddress();
}
}
使用Optional就可以用一行代码解决问题:
String address = Optional.ofNullable(user)
.map(u -> u.getInfo())
.map(info -> info.getAddress())
.orElse(null);
(五)普通场景下的使用
Optional还可以在普通的场景下使用,比如当某个值为空时设置默认值:
User resultUser = Optional.ofNullable(user).orElse(new User());
又比如判断一个对象是否为空:
boolean isPresent = Optional.ofNullable(user).isPresent();
(六)总结
Optional的内容讲到这里就结束了,大部分的应用场景都介绍到了,剩下的就看你举一反三了。我是鱼仔,我们下期再见!
Recommend
-
45
-
49
在日常开发中,我们经常需要在不同的 Git 分支之间来回切换,特别是业务需求比较多的开发人员。在分支较多的情况下,切换分支时分支名的 tab 自动补全会比较糟糕,我们不免需要复制或手打分支名,那么有没有更优雅的方式了呢? ...
-
57
-
66
旧状 我们的业务涉及电商、教育行业,出于营销以及功能需要,会有很多卡片展示(长按保存)的需求,或者分享长图的需求。以及我们有面向商家的PC端,商家端又能编辑、实时预览卡片的样式。 同样的卡片内容我们需要在两端以两种框架(vue react)分别维护。 考虑到
-
5
如何在 Node.js 中更优雅地使用 gRPC:grpc-helper4 Comments 在上一篇的
-
42
vite 支持optional Chaining(可选链判断运算符 ?.)和 nullishCoalescingOperator (空值合并运算符 ??)安装 babel 可选链判断运算符,空值合并运算符 兼容依赖yarn add @babel/plugin-proposal-optional-chaining...
-
5
更优雅地用 JS 进行 “IPC” 调用,我写了 event-invoke 库
-
6
在 Hexo 博客中更优雅地使用 LaTeX 数学公式在 Hexo 博客中如何插入 LaTeX 数学公式早已是老生常谈,搜索引擎中涌现了许多解决方案,我也不想再造轮子。但是再与我使用的 Hexo 主题磨合时总是会出现一点的瑕疵。那么这次便记录下我是如何在...
-
6
空值异常是应用运行时常见的异常,传统方式为了编写健壮的应用,常常使用多层嵌套逻辑判断回避空指针异常。Java8新特性之Optional为此类问题提供了优雅的解决方式。 广大程序员朋友对空值异常刻骨铭心,因此Optional
-
9
我踩过的那些坑,浅谈一下如何更优雅地使用 Linux
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK