向女朋友解释Java8 Optional 到底干啥用的?

女朋友突然在你面前拿出一个包包,问你这个包包是什么牌子? 你怎么办?当然是写段代码打印一下。

public class Boy {
    // new出一个女朋友
    private GirlFriend girlFriend;

    public GirlFriend getGirlFriend() {
        return girlFriend;
    }
}

public class GirlFriend {
    // 对于女朋友来说,包治百病
    private Bag bag;

    public Bag getBag() {
        return bag;
    }
}

public class Bag {
    // 买包,是Gucci还是Prada,你看着办
    private String name;

    public String getName() {
        return name;
    }
}

class Test {
    // 打印一下女朋友包包的名字
    public String getGirlFriendBagName(Boy boy) {
        return boy.getGirlFriend().getBag().getName();
    }
}
复制代码

当你开心的执行这个方法的时候,遇到了意想不到的事。

Exception in thread "main" java.lang.NullPointerException
	at com.yideng.Test.getGirlFriendBagName(Boy.java:33)
	at com.yideng.Test.main(Boy.java:38)
复制代码
向女朋友解释Java8 Optional 到底干啥用的?

作为一个专业的程序员都知道,使用对象之前,要进行判空,于是就是这样。

// 打印一下女朋友包包的名字
public String getGirlFriendBagName(Boy boy) {
    if (boy != null) {
        if (boy.getGirlFriend() != null) {
            if (boy.getGirlFriend().getBag() != null) {
                return boy.getGirlFriend().getBag().getName();
            }
        }
    }
    return null;
}
复制代码

层层判空,你是一个优秀的程序员,肯定看不惯如此冗余的代码,有没有解决办法呢?于是Optional登场了。

1. Optional是啥

Optional类只是对类进行简单封装,没啥特殊的

public final class Optional<T> {
    ...
}
复制代码

2. 怎么创建Optional类

2.1 声明一个空的Optional

Optional<Boy> optBoy = Optional.empty();
复制代码

这时候,optBoy相当于null,不过使用optBoy不会报NullPointerException

2.2 创建一个非空的Optional

Optional<Boy> optBoy = Optional.of(boy);
复制代码

如果传入boy是null,直接报NullPointerException

3. 创建一个接受null的Optional

Optional<Boy> optBoy = Optional.ofNullable(boy);
复制代码

如果传入的boy是null,也不会报错。

3. 如何使用Optional类

3.1 提取Optional对象的属性

Optional<GirlFriend> girlFriend = 
                optBoy.map(Boy::getGirlFriend);
复制代码

这里的map和stream流中的map用法一样,都可以传入一个Function函数,处理对象。

3.2 提前判空对象

optBoy.ifPresent(boy -> System.out.println(boy));
复制代码

如果optBoy是Optional.empty(),就不会执行后面打印方法。

3.3 判空方法提取成if语句

if (optBoy.isPresent()) {
    System.out.println(optBoy);
}
复制代码

如果optBoy是Optional.empty(),isPresent返回false,就不会执行if里面的语句。

3.4 获取Optional对象的属性值

Boy boy = optBoy.get();
复制代码

如果optBoy是Optional.empty(),会抛出异常 java.util.NoSuchElementException: No value present

3.5 给属性设定默认值

Boy boy = optBoy.orElse(new Boy());
复制代码

如果optBoy不是Optional.empty(),就直接返回,否则返回默认值 new Boy()

3.6 过滤Optional对象

// 不是Gucci的包不要
boolean isGucci = optBag.filter(
                bag -> !"Gucci".equals(bag.getName()))
                .isPresent();
复制代码

到此完事,Optional就这么多东西。

向女朋友解释Java8 Optional 到底干啥用的?

原文 

https://juejin.im/post/5e6ca0edf265da575c16d8c0

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 向女朋友解释Java8 Optional 到底干啥用的?

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址