JAVA8之妙用Optional解决判断Null为空的问题

在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示

o_optional1.png

在这种情况下,有如下代码

user.getAddress().getProvince();

这种写法,在user为null时,是有可能报NullPointerException异常的。为了解决这个问题,于是采用下面的写法

    if(user!=null){
        Address address = user.getAddress();
        if(address!=null){
            String province = address.getProvince();
        }
    }

实战使用

例一

在函数方法中

以前写法

    public String getCity(User user)  throws Exception{
            if(user!=null){
                if(user.getAddress()!=null){
                    Address address = user.getAddress();
                    if(address.getCity()!=null){
                        return address.getCity();
                    }
                }
            }
            throw new Excpetion("取值错误");
        }

JAVA8写法

    public String getCity(User user) throws Exception{
        return Optional.ofNullable(user)
                       .map(u-> u.getAddress())
                       .map(a->a.getCity())
                       .orElseThrow(()->new Exception("取指错误"));
    }

例二

比如,在主程序中

以前写法

    if(user!=null){
        dosomething(user);
    }

JAVA8写法

     Optional.ofNullable(user)
        .ifPresent(u->{
            dosomething(u);
    });

例三

以前写法

    public User getUser(User user) throws Exception{
        if(user!=null){
            String name = user.getName();
            if("zhangsan".equals(name)){
                return user;
            }
        }else{
            user = new User();
            user.setName("zhangsan");
            return user;
        }
    }

java8写法

    public User getUser(User user) {
        return Optional.ofNullable(user)
                       .filter(u->"zhangsan".equals(u.getName()))
                       .orElseGet(()-> {
                            User user1 = new User();
                            user1.setName("zhangsan");
                            return user1;
                       });
    }

原文链接:https://blog.csdn.net/zjhred/article/details/84976734

原文地址:https://www.cnblogs.com/yangsanluo/p/14570018.html