• Optional


    Optional

    4.1概述

    ​ Optional是Java8的新特性

    特点:

    • Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
    • Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
    • Optional 类的引入很好的解决空指针异常。

    4.2使用

    4.2.1创建对象

    ​ Optional就好像是包装类,可以把我们的具体数据封装Optional对象内部,然后可以使用Optional的Api操作封装的数据是否为空,优雅的避免空指针

    第一种(推荐):

    ​ 可以使用Optional中的ofNullable()静态方法封装数据

    Author author = getAuthor();
    Optional<Author> optionalAuthor = Optional.ofNullable(author);
    optionalAuthor.ifPresent(author1-> System.out.println(author1.getName()));
    
    • 1
    • 2
    • 3

    ​ 在实际开发中,我们的数据大多数都是从数据库中获取的,Mybatis3.5版本可以支持Optional了,我们可以直接把mapper中的方法返回值定义成Optional,Mybatis会自动将数据封装成Optional类型。

    第二种:

    ​ 如果你肯定你的数据不为null,那么可以使用Optional.of()方法,如果你的数据为null,会报空指针异常(NullPointerException)

    Author author = getAuthor();
    Optional optionalAuthor = Optional.of(author);
    System.out.println(optionalAuthor);
    
    
    • 1
    • 2
    • 3
    • 4

    ​ 扩展方法:Optional.empty()可以是空对象转为Optional类型的空对象,鸡肋,了解即可。

    4.2.2:安全消费值

    ​ 我们获取到一个Optional对象,我们该如何对其中的数据进行使用,可以使用ifPresent方法来进行消费,可以有效避免空指针异常

    例如:

    Author author = getAuthor();
    Optional<Author> optionalAuthor = Optional.ofNullable(author);
    optionalAuthor.ifPresent(author1-> System.out.println(author1.getName()));
    
    • 1
    • 2
    • 3
    4.2.3:获取值

    ​ 不推荐通过Optional封装对象调用get方法直接获取,如果对象为null,会报错,(NoSuchElementException)

    4.2.4:安全的获取值

    ​ 如果我们期望安全的获取值,我们不推荐使用get方法,可以通过以下方法:

    • orElseGet

      可以设置,获取的对象的数据为空时,设置一个默认对象

    // 如果optionalAuthor为null时,会使用optionalAuthor.orElseGet(() -> new Author());创建的对象
    Optional<Author> optionalAuthor = getOptionalAuthor();
    optionalAuthor.ifPresent(author1-> System.out.println(author1.getAge()));
    Author author1 = optionalAuthor.orElseGet(() -> new Author());
    System.out.println(author1.getAge());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • orElseThrow

      获取不到数据可以自定义异常,在开发中可以通过全局异常类进行捕获

    Optional<Author> optionalAuthor = getOptionalAuthor();
    optionalAuthor.ifPresent(author1-> System.out.println(author1.getAge()));
    Author author = optionalAuthor.orElseThrow(() -> new RuntimeException("author为null"));
    System.out.println(author);
    
    • 1
    • 2
    • 3
    • 4
    4.2.5:过滤数据

    ​ 通过使用filter进行过滤,如果过滤后,没有符合条件的,那么会创建一个新的Optional对象为null

        Optional<Author> optionalAuthor = getOptionalAuthor();
        optionalAuthor.filter(author -> author.getAge()>10).ifPresent(author1-> System.out.println(author1.getAge()));
    
    • 1
    • 2
    4.2.6:判断

    ​ 使用isPresent()判断数据是否存在,我的评价是不如直接使用ifPresent()

    Optional<Author> optionalAuthor = getOptionalAuthor();
    if (optionalAuthor.isPresent()){
        System.out.println(optionalAuthor.get().getAge());
    }
    
    • 1
    • 2
    • 3
    • 4
    4.2.7:数据转换

    ​ 通过map方法,与stream流中的map方法相似

    Optional<Author> optionalAuthor = getOptionalAuthor();
    optionalAuthor.map(author -> author.getBooks())
            .ifPresent(books -> System.out.println(books));
    
    • 1
    • 2
    • 3
  • 相关阅读:
    STL笔记
    国家开放大学 试题练习
    面试10000次依然会问的【线程池】,你还不会?
    BufferedReader读文件
    CPG 固体支持物研究:Lumiprobe通用 CPG II 型
    【EMC专题】案例:非接开启后液晶屏闪烁怎么就不是非接的问题?
    web课程设计网页规划与设计 基于HTML+CSS+JavaScript制作智能停车系统公司网站静态模板
    java中有哪些并发的List?只知道一种的就太逊了
    【Python自动化测试】mock模块基本使用介绍
    华为OD机试 - 转盘寿司(Java & JS & Python & C)
  • 原文地址:https://blog.csdn.net/weixin_46073538/article/details/126843417