教你更优雅的写法处理null检查

Posted 黑马程序员官方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了教你更优雅的写法处理null检查相关的知识,希望对你有一定的参考价值。

回顾以前对null的处理方式

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");
        
    

Optional类介绍

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

Optional的基本使用

Optional类的创建方式:

方法说明
Optional.of(T t)创建一个 Optional 实例,内部保存t对象,如果t为null会出现空指针异常
Optional.empty()创建一个空的 Optional 实例,内部保存null
Optional.ofNullable(T t)若 t 不为 null,创建 Optional 实例,否则创建空实例

代码演示:

public static void test02() 
    Optional<String> o1 = Optional.of("小马");
    // Optional<String> o2 = Optional.of(null); // 如果t为null会出现空指针异常
    Optional<String> o3 = Optional.empty();
    Optional<String> 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

Optional类的常用方法:

方法说明
isPresent()判断是否包含值,包含值返回true,不包含值返回false
get()如果Optional有值则将其返回,否则抛出NoSuchElementException
orElse(T t)如果调用对象包含值,返回该值,否则返回参数t
orElseGet(Supplier s)如果调用对象包含值,返回该值,否则返回 s 获取的值

代码演示:

public static void test03() 
    Optional<String> o5 = Optional.of("小马");
    Optional<String> o6 = Optional.empty();
    Optional<String> 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

Optional的高级使用

代码演示:

public static void test04() 
    Optional<String> o8 = Optional.of("小程");
    Optional<String> o9 = Optional.empty();

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


public static void test05() 
    Optional<String> o10 = Optional.of("小序");
    Optional<String> 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。OptionalorElseifPresentorElseGet等方法避免对null的判断,写出更加优雅简洁的代码。

 

以上是关于教你更优雅的写法处理null检查的主要内容,如果未能解决你的问题,请参考以下文章

信息数据教你更懂医

对比webpack,你更应该先掌握gulp10分钟教你彻底掌握gulp

JavaScript 复杂判断的更优雅写法

这篇文章不能教你python编程,但能带你更全面的了解python!

转载javascript 杂谈之哪种写法你更喜欢?

教你如何在工作中“偷懒”,python优雅的帮你解决