• 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
  • 相关阅读:
    Camera1 源码解析系列(五)—— Camera1 takePicture() 流程解析
    nginx 代理接口报404 问题排查
    JeecgBoot 低代码平台 v3.6.0 大版本发布 —1024 程序员节快乐~
    gtsummary绘制三线表/基线资料表/表格
    【第54篇】知识蒸馏:Distilling the Knowledge in a Neural Network
    简述 HTTP 请求的过程是什么?
    C++11 --- lambda表达式
    掌握4C原则,设计高效的系统架构
    C/C++游戏开发(easyx框架)回合制——魔塔
    中国速溶脱脂奶粉市场竞争态势与消费需求预测报告2022-2028年
  • 原文地址:https://blog.csdn.net/weixin_46073538/article/details/126843417