Java七十三: Java8新特性 - - Optional类

Optional类

一、引入
  1. 空指针异常是导致Java应用程序失败的最常见原因,为了解决空指针异常,Google公司在著名的Guava项目中引入Optional类,通过检查空值的方式来防止代码污染,鼓励程序员写更干净的代码。
  2. Optional类(java.util.Optional)是一个容器类,它可以保存类型为T的值,代表这个值存在。或仅仅保存null,表示这个值不存在。原来用null表示一个值不存在,现在Optional可以更好的表达这个概念,并可以避免空指针异常。
  3. Javadoc描述:这是一个可以为null的容器对象。如果有值存在,则isPresent()方法会返回true,调用get()方法会返回该对象。
二、Optional类中的方法

在这里插入图片描述

三、Optional类应用

public class OptionalTest {

    @Test
    public void testOptional() {
        /*
         * 情况1测试
         * boy是Boy类的实例对象,所以不是空,但是boy调用getGirl()时,并没有提前赋值及创建对象,故返回的是空值,
         * 所以再调用getName时,就会报空指针异常
         */
        Boy boy = new Boy();
        String girlName = getGirlName(boy);
        System.out.println(girlName);
        
        // 情况2测试
        // 用传统方法改进后,不会报空指针异常,因为boy不空,但girl为空,所以返回null
        String name1 = getGirlName1(boy);
        System.out.println(name1);
        
        // 情况3测试
        // 创建基于Boy对象的Optional对象,避免Boy对象为空引发的空指针异常,又因此次boy为null,故返回“古力娜扎”
        boy = null;
        String name2 = getGirlName2(boy);
        System.out.println(name2);
        // Boy对象不为空时,不会执行第一层的orElse方法,但Girl对象仍为null,所以返回“迪丽热巴”
        Boy boy1 = new Boy();
        String name3 = getGirlName2(boy1);
        System.out.println(name3);
        // Boy对象和Girl对象均不为空,所以返回自身的值 “欧阳娜娜”
        Boy boy2 = new Boy(new Girl("欧阳娜娜"));
        String name4 = getGirlName2(boy2);
        System.out.println(name4);
    }
    // 上面是三种方法的测试
    //-----------------------------------------------------------------
    
    // 情况1:有空指针异常的方法
    public String getGirlName(Boy boy) {
        return boy.getGirl().getName();
    }
    
    // 情况2:传统方法优化getGirlName
    public String getGirlName1(Boy boy) {
        if (boy != null) {
            Girl girl = boy.getGirl();
            if (girl != null) {
                String name = girl.getName();
                return name;
            }
        }
        return null;
    }
    
    // 情况3:用Optional处理getGirlname方法
    public String getGirlName2(Boy boy) {
        // 1.创建基于Boy对象的Optional的对象
        Optional<Boy> boyOptional = Optional.ofNullable(boy);
        // 2.用新建的Optional的对象的方法来执行对Boy对象的操作,
        //   orElse如果引用者为空,则返回括号内创建的新对象
        Boy boy1 = boyOptional.orElse(new Boy(new Girl("古力娜扎")));

        Girl girl = boy1.getGirl();
        Optional<Girl> girlOptional = Optional.ofNullable(girl);
        Girl girl1 = girlOptional.orElse(new Girl("迪丽热巴"));

        return girl1.getName();
    }
}
四、组合

​ 防止空指针异常,Optional的创建和获取常用下面两种组合方式

  1. Optional.of + get
  2. Optional.ofNullable + orElse
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

e_nanxu

感恩每一份鼓励-相逢何必曾相识

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值