7

使用Optional更优雅地处理非空判断

 3 years ago
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.
neoserver,ios ssh client

(一)引言

在平常的编码之中,有一个错误总会在你的意料之外出现,那就是空指针异常。空指针的出现也很简单,你得到了一个null对象,调用了一些方法,出现空指针异常。空指针会出现在各种地方,常见的比如Map.get()没有获取到对象就调用对象例的方法,类对象没有获取到就调用类中的方法。

af7081956c5145a0982abe4fc88e40dd.png#pic_center

空指针的处理方式也很多,最简单的方式就是用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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK