【Java基础】妙用Optional解决判断Null为空问题

一、背景

在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException。

回顾以前对null的处理方式:

package com.biyu.study.optional;

public class OptionalTest {
    public static void main(String[] args) {
        test01("小度");
        test01(null);
    }

    public static void test01(String userName) {
        if (userName != null) {
            System.out.println("用户名为: " + userName);
        } else {
            System.out.println("用户名为null");
        }
    }
}

这种写法是比较丑陋的,为了避免上述丑陋的写法,让丑陋的设计变得优雅。JAVA8提供了Optional类来优化这种写法,接下来的正文部分进行详细说明

二、Optional类介绍

Optional是JDK1.8推出的一个新的类,是一个没有子类的工具类,Optional可以理解为一个容器,其内部仅能存放一个对象元素或者存放null。它的作用主要就是为了解决避免Null检查,防止NullPointerException。

1、Optional(T value),empty(),of(T value),ofNullable(T value)

这四个函数之间具有相关性,因此放在一组进行记忆。

Optional(T value),即构造函数,它是private权限的,不能由外部调用的。

其余三个函数是public权限,供我们所调用。那么,Optional的本质,就是内部储存了一个真实的值,在构造的时候,就直接判断其值是否为空。好吧,这么说还是比较抽象。直接上Optional(T value)构造函数的源码,如下图所示。

代码演示:

package com.biyu.study.optional;

import java.util.Optional;

public class OptionalTest {
    public static void main(String[] args) {
        //test01("小度");
        //test01(null);
        test02();
    }

    public static void test01(String userName) {
        if (userName != null) {
            System.out.println("用户名为: " + userName);
        } else {
            System.out.println("用户名为null");
        }
    }

    public static void test02() {
        Optional o1 = Optional.of("小度");
        // Optional o2 = Optional.of(null); // 如果t为null会出现空指针异常
        Optional o3 = Optional.empty();
        Optional o4 = Optional.ofNullable(null);
        System.out.println("o1 = " + o1);
        // System.out.println("o2 = " + o2);
        System.out.println("o3 = " + o3);
        System.out.println("o4 = " + o4);
    }
}

运行结果:

o1 = Optional[小度]
o3 = Optional.empty
o4 = Optional.empty

2、Optional类的常用方法:

方法

说明

isPresent()

判断是否包含值,包含值返回true,不包含值返回false

get()

如果Optional有值则将其返回,否则抛出NoSuchElementException

orElse(T t)

如果调用对象包含值,返回该值,否则返回参数t

orElseGet(Supplier s)

如果调用对象包含值,返回该值,否则返回 s 获取的值

代码演示:

public static void test03() {
        Optional o5 = Optional.of("小度");
        Optional o6 = Optional.empty();
        Optional o7 = Optional.ofNullable(null);

        // isPresent() : 判断是否包含值,包含值返回true,不包含值返回false。
        if (o5.isPresent()) {
            // get() : 如果Optional有值则将其返回,否则抛出NoSuchElementException。
            String userName = o5.get();
            System.out.println("用户名o5为:" + userName);
        } else {
            System.out.println("用户名o5为null");
        }

        if (o6.isPresent()) {
            String userName = o6.get();
            System.out.println("用户名o6为:" + userName);
        } else {
            System.out.println("用户名o6为null");
        }

        if (o7.isPresent()) {
            String userName = o7.get();
            System.out.println("用户名o7为:" + userName);
        } else {
            System.out.println("用户名o7为null");
        }
    }

运行结果:

用户名o5为:小度
用户名o6为null
用户名o7为null

3、Optional的高级使用

public static void test04() {
    Optional o8 = Optional.of("小白");
    Optional o9 = Optional.empty();

    // 存在做的什么
    o8.ifPresent(s -> System.out.println("用户名o8为" + s));
    o9.ifPresent(s -> System.out.println("用户名o9为" + s));
}

public static void test05() {
    Optional o10 = Optional.of("小黑");
    Optional o11 = Optional.empty();

    // 如果调用对象包含值,返回该值,否则返回参数
    System.out.println("用户名o10为: " + o10.orElse("不存在数据10"));
    System.out.println("用户名o11为: " + o11.orElse("不存在数据11"));

    // 如果调用对象包含值,返回该值,否则返回参数Supplier得到的值
    String s10 = o10.orElseGet(() -> {return "未知用户名10";});
    System.out.println("s10 = " + s10);

    String s11 = o11.orElseGet(() -> {return "未知用户名11";});
    System.out.println("s11 = " + s11);
}

运行结果:

用户名o8为小白
用户名o10为: 小黑
用户名o11为: 不存在数据11
s10 = 小黑
s11 = 未知用户名

三、总结

Optional可以理解为一个容器,其内部仅能存放一个对象元素或者存放null。它的作用主要就是为了解决避免Null检查,防止NullPointerException。Optional的orElse,ifPresent,orElseGet等方法避免对null的判断,写出更加优雅简洁的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宝爷~

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值