evt参数是干啥用的_女朋友问我,Java8 Optional 到底干啥用的?

  1. 前情提要

女朋友突然在你面前拿出一个包包,问你这个包包是什么牌子?

你怎么办?当然是写段代码打印一下。

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.NullPointerExceptionat com.yideng.Test.getGirlFriendBagName(Boy.java:33)at com.yideng.Test.main(Boy.java:38)
a75cad04ab98422fe99339feedb1f85a.png

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

// 打印一下女朋友包包的名字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 {    ...}
  1. 怎么创建Optional类

2.1 声明一个空的Optional

Optional optBoy = Optional.empty();

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

2.2 创建一个非空的Optional

Optional optBoy = Optional.of(boy);

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

2.3 创建一个接受null的Optional

Optional optBoy = Optional.ofNullable(boy);

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

3. 如何使用Optional类

3.1 提取Optional对象的属性

Optional 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();

4. 用Optional改写原来的方法

public String getGirlFriendBagName(Optional optBoy) {    return optBoy.map(Boy::getGirlFriend)            .map(GirlFriend::getBag)            .map(Bag::getName)            .orElse("Gucci");}

是不是优雅了许多,到此完事,Optional就这么多东西。

cacb28267ccc469edcc1eb699aecd30b.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值