Optional简述(Java8新特性)

news/2024/7/5 2:52:17

Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,使用Optional类可以避免显式的null值判断(null的防御性检查),避免null导致的NPE(NullPointerException)。总而言之,就是对控制的一个判断,为了避免空指针异常。

一、引言

首先我们看下面一段代码,肯定会很熟悉

public static String getGender(Student student){

    if(null == student){
        return "Unkown";
    }

    return student.getGender();
        
}

从上面看出,就是对这个实例是不是空做了判断,然后我们看下使用java8 的Optional类之后的代码,挺实用的。

public static String getGender(Student student){

   return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown");
        
}

二、Optional类介绍

Optional 类主要特点说明下:

  1. 构造方法是私有,不能new来创建,
  2. Optional的三个静态方法来创建对象,【empty()、of()、ofNullable()】
// 1、创建一个包装对象值为空的Optional对象
Optional<String> optStr = Optional.empty();
// 2、创建包装对象值非空的Optional对象
Optional<String> optStr1 = Optional.of("optional");
// 3、创建包装对象值允许为空的Optional对象
Optional<String> optStr2 = Optional.ofNullable(null);

三、Optional类的使用

1. get方法

        直接放回包装对象的实际值,为null抛出异常

2. isPresent方法

        判断包装对象是否为空

3.  ifPresent方法

        不为空时进行操作,内部自动判断null处理

public static void printName(Student student){

    Optional.ofNullable(student).ifPresent(u ->  System.out.println("The student name is : " + u.getName()));

}

4. filter方法

        用于对Optional对象进行过滤

public static void filterAge(Student student){

    Optional.ofNullable(student).filter( u -> u.getAge() > 18).ifPresent(u ->  System.out.println("The student age is more than 18."));
    
}

5. map方法

        map()方法的参数为Function(函数式接口)对象,map()方法将Optional中的包装对象用Function函数进行运算,并包装成新的Optional对象。

public static Optional<Integer> getAge(Student student){

    return Optional.ofNullable(student).map(u -> u.getAge()); 

}

6. flatMap方法

        map()方法不同的是,入参Function函数的返回值类型为Optional<U>类型,而不是U类型,这样flatMap()能将一个二维的Optional对象映射成一个一维的对象。

public static Optional<Integer> getAge(Student student){

    return Optional.ofNullable(student).flatMap(u -> Optional.ofNullable(u.getAge())); 
}

7. orElse方法

        如果包装对象值非空,返回包装对象值,否则返回入参other的值(默认值)。

public static String getGender(Student student){

   return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown");
        
}

8. orElseGet方法

        orElseGet()方法与orElse()方法类似,区别在于orElseGet()方法的入参为一个Supplier对象,用Supplier对象的get()方法的返回值作为默认值。

public static String getGender(Student student){

    return Optional.ofNullable(student).map(u -> u.getGender()).orElseGet(() -> "Unkown");      

}

9. orElseThrow方法

        用于包装对象值为空时需要抛出特定异常的场景。

public static String getGender1(Student student){

    return Optional.ofNullable(student).map(u -> u.getGender()).orElseThrow(() -> new RuntimeException("Unkown"));      

}

        Optional开发时要注意正确使用Optional格式,谨慎使用isPresent()和get()方法,尽量多使用map()、filter()、orElse()等方法来发挥Optional的作用。


http://lihuaxi.xjx100.cn/news/1243653.html

相关文章

高速视觉筛选机PCI Express实时运动控制卡XPCIE1028

产品导读 正运动技术的PCI Express总线运动控制卡XPCIE1028&#xff0c;具备位置锁存、多维高速硬件位置比较输出PSO、同步跟随、精准触发的运动控制和I/O控制功能。 配合正运动技术MotionRT7实时内核使用&#xff0c;可高度满足高速视觉筛选机应用所需的运动控制需求。 XPC…

linuxOPS基础_yum详解

yum是如何安装软件的 yum仓库&#xff08;也称yum源&#xff09;用于存放各种rpm的软件包以及软件包之间的依赖关系&#xff08;repodata目录&#xff09;需要安装软件的计算机连接到指定yum仓库来安装软件包 yum源作用 软件包管理器&#xff0c;类似Windows下的软件管家 yu…

为什么超三成制造企业上市公司选择用友U9 cloud?

导读&#xff1a;30%制造企业上市公司和40%专精特新制造业上市公司都选择用友U9 cloud 当前&#xff0c;数智化转型已经成为中国制造重构竞争力、实现高质量发展的必经之路。《“十四五”智能制造发展规划》提出&#xff0c;到2025年&#xff0c;70%的规模以上制造业企业基本实…

由于找不到msvcr120.dll,无法继续执行代码,多种解决方法修复这个故障

在使用电脑时&#xff0c;我们常常会遇到各种各样的问题。其中一个比较常见的问题是“由于找不到msvcr120.dll,无法继续执行代码”。这个问题可能会让一些用户感到困惑和无助。那么&#xff0c;究竟什么是msvcr120.dll&#xff1f;它缺失了会有什么后果&#xff1f;如何修复这个…

SpringBatch从入门到实战(六):ItemReader

一&#xff1a;ListItemReader 用于简单的开发测试。 Bean public ItemReader<String> listItemReader() {return new ListItemReader<>(Arrays.asList("a", "b", "c")); }二&#xff1a;FlatFileItemReader 1.1 完全映射 当文件…

【计算机网络基础】第3章 单元复习

文章目录 一. 单选题(共22题)二. 填空题(共7题)三. 判断题(共5题)一. 单选题(共22题) (单选题)以下哪一个不是关于千兆位以太网的正确描述( D )。 A. 支持全双工传送方式 B. 帧格式与以太网帧格式相同 C. 数据传输速率为1000Mb/S D. 只能基于光纤实现 (单选题)下列设…

clickhouse--通过命令行导入、导出数据示例

导入、导出的数据格式 ClickHouse可以接受和返回各种格式的数据,如CSV、JSON、XML、PARQUET等 输入支持的格式可用于解析提供给insert的数据,从文件支持的表(如File、URL或HDFS)执行select,或读取字典。支持的输出格式可用于安排SELECT的结果,并在文件支持的表中执行inser…

电商--抢购架构总结

文章目录 背景业务流程业务难点技术难点技术方案技术方向具体落地客户端流控网关流控容器流控后端接口流控数据库流控 流控总结优化读取加速异步化流程处理系统扩容 压测监控 总结参考文献 背景 这是个在做NFT电商项目时遇到的场景&#xff0c;要求运营可以商家某个系列的NFT商…