iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java新特性:Optional类
  • 355
分享到

Java新特性:Optional类

java开发语言Optional 2023-08-17 06:08:50 355人浏览 泡泡鱼
摘要

Java新特性:Optional类 Optional 类是 Java 8 才引入的,Optional 是个容器,它可以保存类型 T 的值,或者仅仅保存 null。Optional 提供了很多方法,这样我们就不用显式进行空值检测。Opti

Java新特性:Optional类

Optional 类是 Java 8 才引入的,Optional 是个容器,它可以保存类型 T 的值,或者仅仅保存 null。Optional 提供了很多方法,这样我们就不用显式进行空值检测。Optional 类的引入很好的解决空指针异常。

Java 8 引入 Optional 类,用来解决 NullPointerException。 Optional 代替 if…else 解决空指针问题,使代码更加简洁。



1、Optional类概述

1.1、Optional类介绍

Optional 类是 Java 8 才引入的,Optional 是个容器,它可以保存类型 T 的值,或者仅仅保存 null。Optional 提供了很多方法,这样我们就不用显式进行空值检测。Optional 类的引入很好的解决空指针异常。

Java 8 引入 Optional 类,用来解决 NullPointerException。 Optional 代替 if…else 解决空指针问题,使代码更加简洁。

1.2、Java8之前的空指针异常判断

Java 在使用对象过程中,访问任何方法或属性都可能导致 NullPointerException:

例如我们通过以下方法,获取存在 student 对象中的 Age 值。

        public String getIsocode (Student student){            return student.getAge();        }

在这样的示例中,如果我们想要避免由 studentstudent.age 为空而导致的空指针问题,我们就需要采用防御式检查减少 NullPointerException(在访问每一个值之前对其进行明确地检查):

       public String getIsocode (Student student){            if (null == student) {                // doSomething                return "Unknown";            }            if (null = student.getAge()) {                // doSomething                return "Unknown";            }            return student.getAge();        }

然而,这种方案并不是很理想,因为为此会多出多个不同的退出点(return),使得代码维护变得艰难,之后每个可能的 null 检查都会新增一个退出点。

为了简化这个过程,我们来看看用 Optional 类是怎么做的。

1.3、Java8之后Optional的使用

当需要判断的量多时,此时的这些判断语句可能会导致代码臃肿冗余,为此 Java8 特意推出了 Optional 类来帮助我们去处理空指针异常。

下面是 Optional 的一些基本用法:

@Datapublic class Student {    private Integer age;}---public class Test {    public static void main(String[] args) {        // 假设 student 这个对象从数据库中查出的        Student student = getStudent();        // 创建一个可接受 null 的 Optiona l类        Optional optional = Optional.ofNullable(student);        // 用法1:获取 student 对象中的某个值,如果不存在的话则取默认值(不具有短路作用)        Integer a1 = optional.map(Student::getAge).orElse(20));        // 用法2:获取 student 对象中的某个值,如果不存在的话则取默认值(具有短路作用,因为是懒加载)        Integer a2 = optional.map(Student::getAge).orElseGet(() -> Integer.MAX_VALUE);      // 用法3:判断对象是否存在,不存在则抛出异常        optional.orElseThrow(() -> new RuntimeException("student不存在!"));      // 用法4:判断对象是否存在,存在的话对对象进行操作,例如给对象赋初始值        optional.ifPresent(o -> o.setAge(18));      // 用法5:对象存在时,且年龄满足一定条件容器才会继续保存这对象,否则将会剔除        optional.filter(o -> o.getAge() > 10);    }}

2、Optional类使用

2.1、Optional类常用方法总结
方法描述
empty返回一个空的 Optional 实例
filter如果值存在并且满足提供的谓词,就返回包含该值的 Optional 对象;否则返回一个空的 Optional 对象
flatMap如果值存在,就对该值执行提供的 mapping 函数调用,返回一个 Optional 类型的值,否则就返回一个空的 Optional 对象
get如果该值存在,将该值用 Optional 封装返回,否则抛出一个 NoSuchElementException 异常
ifPresent如果值存在,就执行使用该值的方法调用,否则什么也不做
isPresent如果值存在就返回 true,否则返回 false
map如果值存在,就对该值执行提供的mapping 函数调用
of将指定值用 Optional 封装之后返回,如果该值为 null,则抛出一个 NullPointerException 异常
ofNullable将指定值用 Optional 封装之后返回,如果该值为 null,则返回一个空的 Optional 对象
orElse如果有值则将其返回,否则返回一个默认值
orElseGet如果有值则将其返回,否则返回一个由指定的 Supplier 接口生成的值
orElseThrow如果有值则将其返回,否则抛出一个由指定的 Supplier 接口生成的异常
2.2、Optional对象创建
2.2.1、Optional.empty()方法

使用 Optional.empty() 方法声明一个空的 Optional:

// 通过静态工厂方法 Optional.empty(),创建一个空的 Optional 对象Optional optStudent = Optional.empty();
2.2.2、Optional.of(T t)方法

使用 Optional.of(T t) 方法创建一个包含非空值的 Optional 对象 (不推荐):

// 静态工厂方法 Optional.of(T t),依据一个非空值创建一个 Optional 对象Optional optStudent = Optional.of(student);

如果 student 为 null,这段代码会立即抛出一个 NullPointerException,而不是等到访问 student 的属性值时才返回一个错误。

2.2.3、Optional.ofNullable(T t)方法

使用 Optional.ofNullable(T t) 方法创建一个包含可能为空的值的 Optional 对象 (推荐):

// 用静态工厂方法 Optional.ofNullable(T t),你可以创建一个允许 null 值的 Optional 对象Optional optStudent = Optional.ofNullable(student);
2.3、Optional对象获取
2.3.1、get()方法

get() 方法,如果变量存在,它直接返回封装的变量值,否则就抛出一个 NoSuchElementException 异常,不推荐使用:

optional.map(Student::getAge).get()
2.3.2、orElse(T other)方法

orElse(T other) 方法,它允许你在 Optional 对象不包含值时提供一个默认值:

optional.map(Student::getAge).orElse(20));
2.3.3、orElseGet(Supplier other)方法

orElseGet(Supplier other) 方法,它是 orElse 方法的延迟调用版,Supplier 方法只有在 Optional 对象不含值时才执行调用(懒加载):

optional.map(Student::getAge).orElseGet(() -> Integer.MAX_VALUE);
2.3.4、orElseThrow(Supplier exceptionSupplier)方法

orElseThrow(Supplier exceptionSupplier) 方法,它和 get 方法非常类似,它们遭遇 Optional 对象为空时都会抛出一个异常,但是使用 orElseThrow 可以定制希望抛出的异常类型:

optional.orElseThrow(() -> new RuntimeException("student不存在!"));
2.3.5、ifPresent(Consumer consumer)方法

ifPresent(Consumer consumer) 方法,它让能在变量值存在时执行一个作为参数传入的方法,否则就不进行任何操作:

optional.ifPresent(o -> o.setAge(18));
2.4、Optional对象中值的提取和转换
2.4.1、map()方法

map() 方法,如果值存在,就对该值执行提供的 mapping 函数调用,如果值不存在,则返回一个空的 Optional 对象。

引入 Optional 以前:

String name = null;    if(insurance != null){        name = insurance.getName();    }

引入 Optional 以后:

Optional name = Optional.ofNullable(insurance).map(Insurance::getName);

Optional 的 map 方法和 Java 8 中 Stream 的 map 方法相差无几。

2.4.2、flatMap()方法

flatMap() 方法,对于嵌套式的 Optiona 结构,我们应该使用 flatMap 方法,将两层的 Optional 合并成一个。

我们试着重构以下代码:

  public String getCarInsuranceName(Person person) {      return person.getCar().getInsurance().getName();  }

由于我们刚刚学习了如何使用 map,我们的第一反应可能是我们可以利用 map 重写之前的代码:

  Optional optPerson = Optional.of(person);      Optional name =          optPerson.map(Person::getCar)                   .map(Car::getInsurance)                   .map(Insurance::getName);

不幸的是,这段代码无法通过编译。为什么呢? optPerson 是 Optional 类型的 变量, 调用 map 方法应该没有问题。但 getCar 返回的是一个 Optional 类型的对象,这意味着 map 操作的结果是一个 Optional> 类型的对象。因此,它对 getInsurance 的调用是非法的。

下面应用 map 和 flatMap 对上述示例进行重写:

  public String getCarInsuranceName(Optional person) {       return person.flatMap(Person::getCar)                       .flatMap(Car::getInsurance)                       .map(Insurance::getName)                       .orElse("Unknown"); // 如果Optional的结果 值为空设置默认值  }
2.5、Optional对象其他方法
2.5.1、isPresent()方法

可以使用 isPresent() 方法检查 Optional 对象是否包含非空值,例如:

Optional optional = Optional.of("Hello World"); if (optional.isPresent()) {     System.out.println(optional.get()); }
2.5.2、filter()方法

filter() 方法接受一个谓词作为参数。如果 Optional 对象的值存在,并且它符合谓词的条件,filter 方法就返回其值,否则它就返回一个空的 Optional 对象。

比如,你可能需要检查保险公司的名称是否为 “Cambridge-Insurance”。

Insurance insurance = ...;if(insurance != null && "CambridgeInsurance".equals(insurance.getName())){System.out.println("ok");  }

使用 Optional 对象的 filter 方法,这段代码可以重构如下:

Optional optInsurance = ...;optInsurance.filter(insurance -> "CambridgeInsurance".equals(insurance.getName()))            .ifPresent(x -> System.out.println("ok"));

3、Optional注意事项

3.1、Optional的序列化问题

由于 Optiona l类设计时就没特别考虑将其作为类的字段使用,所以它也并未实现 Serializable 接口。由于这个原因,如果你的应用使用了某些要求序列化的库或者框架,在域模型中使用Optional,有可能引发应用程序故障。

然而,我们相信,通过前面的介绍,我们已经看到用 Optional 声明域模型中的某些类型是个不错的主意,尤其是你需要遍历有可能全部或部分为空,或者可能不存在的对象时。如果你一定要实现序列化的域模型,作为替代方案, 我们建议你像下面这个例子那样,提供一个能访问声明为 Optional、变量值可能缺失的接口,代码清单如下:

public class Person {    private Car car;    public Optional getCarAsOptional() {      return Optional.ofNullable(car);    } }
3.2、避免使用基础类型的 Optional 对象

Optional 提供了的一些基础类型 —— OptionalIntOptionalLong 以及 OptionalDouble ,但不推荐大家使用基础类型的 Optional,因为基础类型的 Optional 不支持 map、 flatMap 以及 filter 方法,而这些却是 Optional 类常用的方法。可以使用 OptionalOptionalOptional 等替代。3. orElse方法的使用

3.3、orElse方法的使用

orElse 中调用的方法一直都会被执行,orElseGet 方法只有在 Optional 对象不含值时才会被调用,所以使用 orElse 方法时需要谨慎, 以免误执行某些不被预期的操作。此种情况下,可使用 orElseGet 方法代替它。

来源地址:https://blog.csdn.net/weixin_45187434/article/details/131795511

--结束END--

本文标题: Java新特性:Optional类

本文链接: https://www.lsjlt.com/news/372442.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java新特性:Optional类
    Java新特性:Optional类 Optional 类是 Java 8 才引入的,Optional 是个容器,它可以保存类型 T 的值,或者仅仅保存 null。Optional 提供了很多方法,这样我们就不用显式进行空值检测。Opti...
    99+
    2023-08-17
    java 开发语言 Optional
  • Java8新特性Optional类怎么应用
    这篇“Java8新特性Optional类怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java8新特性Optiona...
    99+
    2023-06-29
  • Java 8 新特性之Optional详细介绍
    Java Optional是Java 8引入的一个类,用于处理可能为空(null)的值,以提供更安全和优雅的方式来处理这些情况。它旨在帮助开发人员编写健壮、可读性强的代码,并减少空指针异常的发生。 Java Optional提供了以下重要特...
    99+
    2023-09-26
    java 开发语言
  • 关于Java8新特性Optional类的详细解读
    目录一、Optional类的出现二、Optional类概述三、Optional类常用方法1. 创建Optional类对象的方法2. 判断Optional容器中是否包含对象3. 获取O...
    99+
    2023-05-19
    Java8 Optional Java Optional类
  • Java8新特性Optional容器类的应用有哪些
    这篇文章主要讲解了“Java8新特性Optional容器类的应用有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java8新特性Optional容器类的应用有哪些”吧!1.Optiona...
    99+
    2023-06-25
  • Java8新特性Optional类及新时间日期API示例详解
    目录Optional类以前对null的处理Optional类介绍Optional的基本使用Optional的常用方法新时间日期API旧版日期时间的问题新日期时间API介绍日期时间的常...
    99+
    2022-11-13
    Java8 Optional类时间日期API Java8 新特性
  • 如何深度解析java8新特性Optional
    本篇文章为大家展示了如何深度解析java8新特性Optional,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 下面以jdk1.8.0_111源码为例 publ...
    99+
    2024-04-02
  • 深入理解Java8新特性之Optional容器类的应用
    1.Optional容器类 Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,...
    99+
    2024-04-02
  • Java JDK8新增Optional工具类讲解
    Optional 空指针异Optional常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava...
    99+
    2024-04-02
  • JDK1.8新特性之方法引用 ::和Optional详解
    一:简介 方法引用分为三种,方法引用通过一对双冒号:: 来表示,方法引用是一种函数式接口的另一种书写方式 静态方法引用,通过类名::静态方法名, 如 Integer::pa...
    99+
    2024-04-02
  • Java JDK8新增Optional工具类怎么用
    这篇文章主要为大家展示了“Java JDK8新增Optional工具类怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java JDK8新增Optional工具类怎么用”这篇文章吧。Opti...
    99+
    2023-06-20
  • Java——JDK1.8新特性
    目录 一、Lambda 表达式 (一)Lambda 表达式语法 (二)类型推断 二、函数式接口 (一)自定义函数式接口 (二)作为参数传递Lambda 表达式 (三)Java 内置四大核心函数式接口 三、方法引用 四、Stream API ...
    99+
    2023-09-22
    java 开发语言 servlet 后端 java-consul
  • Java8新特性Optional类处理空值判断回避空指针异常应用
    目录一、序言二、问题复原(一)素材准备(二)模拟演示1、传统方式2、优雅方式三、小结一、序言 空值异常是应用运行时常见的异常,传统方式为了编写健壮的应用,常常使用多层嵌套逻辑判断回避...
    99+
    2024-04-02
  • JAVA 8 的新特性
    简介: 前段时间面了完美世界,被问到Java8的新特性,在此特地记录一下,虽然现在Java的版本可能已经很高了,但是Java8的新特性依然值得学习一下! 1. Lambda 表达式 lambda表达...
    99+
    2023-09-08
    java 开发语言
  • 如何使用Java Optional类
    这篇文章主要讲解了“如何使用Java Optional类”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Java Optional类”吧!注意:示例代码要求使用Java 11及更高版本...
    99+
    2023-06-02
  • Java关于JDK1.8中的Optional类
    目录Java关于JDK1.8中的Optional类一、定义二、Optional方法的使用1、empty 方法2、of 方法返3、返回一个Optional实例4、isPresent 方...
    99+
    2024-04-02
  • Java 10 新特性解读
    Java 10 是 JDK 的第十个版本,于 2018 年 3 月发布。Java 10 引入了一些新的特性和改进,下面是对其进行的解...
    99+
    2023-09-13
    Java
  • Java 9 Optional API 新增方法
    本文我们介绍了Java 9 Optional Api新增的三个方法。or方法在Optional为空时返回Optional对象。 ifPresentOrElse()在值存在时执行Consumer参数,反之执行另一个参数回调参数。感兴趣的朋友一...
    99+
    2023-06-02
  • Java 8 - Optional类深度解析
    对Java 8 Optional类进行深度解析。 @pdaiJava 8 - Optional类深度解析Optional类包含的方法ofofNullableisPresentgetifPresentorElseorElseGetorElse...
    99+
    2022-12-02
    java框架 java全栈 java学习路线 java全栈知识 java面试 知识体系 java技术体系 java编程
  • 怎么在JAVA中使用Optional类
    怎么在JAVA中使用Optional类?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Optional在JAVA中被定义为一个容器类,更确切的说只存一个元素的容器。conta...
    99+
    2023-05-30
    java optional
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作