Optional学习记录

Optional出现的意义

在Java中,我们经常遇到的一种异常情况:空指针异常,在原本的编程中,为了避免这种异常,我们通常会向对象进行判断,然而,过多的判断语句会让我们的代码显得臃肿不堪。
所以在JDK8中引入了Optional,养成使用Optional的习惯后你可以写出更优雅的代码来避免空指针异常。
并且在很多函数式编程相关的API中也都用到了Optional,如果不会使用Optional也会对的数式编程的学习造成影响。

public static void main(String[] args) {Author auhtor=getAuthor();Optional<Author> optionalAuthor = Optional.ofNullable(auhtor);optionalAuthor.ifPresent(author -> System.out.println(author.getAge()));}public static Author getAuthor(){Author author=new Author("罗贯中",46);return author;}

此时,通过Optional中提供的ifPresent方法可以有效的避免空指针异常问题。
事实上,在我们进行开发过程中,如果使用了Mybatis框架,那么我们只需将其返回值定义为Optional类型,则Mybatis框架会自动帮我们将数据封装。

Optional中的方法

所谓的Optional其实是将一些数据封装为Optional的属性,随后我们通过Optional中的一些方法来使用这些数据对象。

安全消费值

我们获取到一个Optional对象后肯定需要对其中的数据进行使用。这时候我们可以使用其ifpresent方法对来消费其中的值。
这个方法会判断其内封装的数据是否为空,不为空时才会执行具体的消费代码。这样使用起来就更加安全了。
例如,以下写法就优雅的避免了空指针异常。

 public static Optional<Author> getOptionAuthor(){Author author=new Author("罗贯中",46);return Optional.ofNullable(author);}

安全获取值

如果我们期望安全的获取值。我们不推荐使用get方法,而是使用Optional提供的以下方法。

public static Optional<Author> getOptionAuthor(){Author author=new Author("罗贯中",46);return Optional.empty();//Optional的empty方法可以赋空值}

随后我们通过get方法获取,发现抛出空指针异常。

Author author = optionAuthor.get();
System.out.println(author);

在这里插入图片描述

因此,为了安全获取值,我们可以采用orElseGet方法:获取数据并且设置数据为空时的默认值。如果数据不为空就能获取到该数据。如果为空则根据你传入的参数来创建对象作为默认值返回。
即optionAuthor如果有值则返回原值,否则就返回一个我们定义的对象。

	Author author = optionAuthor.orElseGet(new Supplier<Author>() {@Overridepublic Author get() {return new Author();//返回值为一个定义的Author}});

对应的Lambda表达式:

Author author = optionAuthor.orElseGet(() -> new Author());

另一种方式则是抛出我们自定义的异常,这种方式在Spring框架中可以很好的应用。

 try {Author author1 = optionAuthor.orElseThrow(new Supplier<Throwable>() {@Overridepublic Throwable get() {return new RuntimeException("数据为null");}});System.out.println(author1);//author1只能在try中调用} catch (Throwable e) {throw new RuntimeException(e);}

对应的Lambda表达式,当然,对于这种异常,除了try catch外,我们也可以手动抛出。

try {Author author1 = optionAuthor.orElseThrow((Supplier<Throwable>) () -> new RuntimeException("数据为null"));System.out.println(author1);} catch (Throwable e) {throw new RuntimeException(e);}

在这里插入图片描述

filter过滤

过滤方法其实与Stream中的方式即为相似。

我们可以使用fiter方法对数据进行过滤。如果原本是有数据的,但是不符合判断,也会变成一个无数据的Optional对象。

Optional<Author> author1 = optionalAuthor.filter(author -> author.getAge() > 140);

可以看到,filter的返回值也是一个Optional类型的对象,此时当author不符合判断条件时,返回值为Optional.empty,即为空。

在这里插入图片描述

ifPresent判断

通过ifPresent来判断是否存在。

 optionalAuthor.filter(author -> author.getAge()>140).ifPresent(author -> System.out.println(author));

map数据转换

该方法其实与Stream流中的方法很像,实现起来也是极为相似。我们可以看到map的返回值是Optional<ArrayList< Books >>。

optionalAuthor.map(new Function<Author, ArrayList<Books>>() {@Overridepublic ArrayList<Books> apply(Author author) {return author.getBooks();}}).ifPresent(new Consumer<ArrayList<Books>>() {@Overridepublic void accept(ArrayList<Books> books) {System.out.println(books);}});

对应的lambda表达式:

 optionalAuthor.map(author -> author.getBooks()).ifPresent(books -> System.out.println(books));

在这里插入图片描述

函数式接口

只有一个抽象方法的接口我们称之为函数接口。
JDK的函数式接口都加上了@Functionalinterface 注解进行标识。但是无论是否加上该注解,只要接口中只有一个抽象方法,都是函数式接口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/323661.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ETL工具kettle(PDI)入门教程,Transform,Mysql->Mysql,Csv->Excel

什么是kettle&#xff0c;kettle的下载&#xff0c;安装和配置&#xff1a;ETL免费工具kettle(PDI)&#xff0c;安装和配置-CSDN博客 mysql安装配置&#xff1a;Linux Centos8 Mysql8.3.0安装_linux安装mysql8.3-CSDN博客 1 mysql -> mysql 1.1 mysql CREATE TABLE user_…

《黑暗之魂》系列迎来打折:魂三标准版半价134,豪华版199

《黑暗之魂》系列游戏降价促销&#xff0c;现在是购买的好时机&#xff01;想必喜欢挑战和探索的玩家们对这个消息会特别感兴趣。让我们来看看具体的折扣信息吧&#xff01; 首先是《黑暗之魂&#xff1a;重制版》&#xff0c;原价198元&#xff0c;现价仅为99元&#xff01;这…

DSP开发实战教程-国产DSP替代进口TI DSP的使用技巧

1.替换CCS安装路径下的Flash.out文件 找到各自CCS的安装路径&#xff1a; D:\ti\ccs1230\ccs\ccs_base\c2000\flashAlgorithms 复制进芯电子国产DSP官网提供的配置文件 下载链接&#xff1a;https://mp.csdn.net/mp_download/manage/download/UpDetailed 2.替换原有文件 3.…

密码学《图解密码技术》 记录学习 第十三章

目录 第十三章 13.1 本章学习的内容 13.2 PGP 简介 13.2.1 什么是 PGP 13.2.2 关于 OpenPGP 13.2.3关于GNU Privacy Guard 13.2.4 PGP 的功能 公钥密码 数字签名 单向散列函数 证书 压缩 文本数据 大文件的拆分和拼合 13.3 生成密钥对 13.4 加密与解密 13.4.1 加密 生成…

电脑显示丢失mfc140u.dll怎么修复,总共有7个方法

mfc140u.dll 是一个动态链接库&#xff08;Dynamic Link Library&#xff09;文件&#xff0c;它是Microsoft Foundation Class (MFC)库的一部分&#xff0c;专为使用C编程语言开发Windows应用程序而设计。MFC库由微软提供&#xff0c;作为一个高级的应用程序框架&#xff0c;旨…

数据分析——业务指标量化

业务指标量化 前言一、统计指标二、统计指标特点完整的统计指标统计指标的理解和使用方法 三、统计指标类型总量指标时期指标时点指标总量指标的作用 相对指标计划完成相对数指标结构相对数指标比例相对数指标比较相对数指标动态相对数指标 平均指标 四、数量指标和质量指标五、…

【JVM】从硬件层面和应用层面的有序性和可见性,到Java的volatile和synchronized

Java的关键字volatile保证了有序性和可见性&#xff0c;这里我试着从底层开始讲一下有序性和可见性。 一&#xff0c;一致性 数据如果同时被两个cpu读取了&#xff0c;如何保证数据的一致性&#xff1f;或者换句话说&#xff0c;cpu1改了数据&#xff0c;cpu2的数据就成了无效…

Final Draft 12 for Mac:高效专业剧本创作软件

对于剧本创作者来说&#xff0c;一款高效、专业的写作工具是不可或缺的。Final Draft 12 for Mac就是这样一款完美的选择。这款专为Mac用户设计的剧本创作软件&#xff0c;凭借其卓越的性能和丰富的功能&#xff0c;让您的剧本创作更加得心应手。 Final Draft 12支持多种剧本格…

QML及VTK配合构建类MVVM模式DEMO

1 创建QT QUICK项目 这次我们不在主程中加载VTK的几何&#xff1b; 在qml建立的控件&#xff0c;创建MyVtkObject类的单例&#xff0c;main中将指针和单例挂钩&#xff1b; 在MyVtkObject实例中操作 QQuickVTKRenderItem 类即可&#xff1b; 由于VTK的opengl显示是状态机&a…

Bpmn.js使用(仅查看版)

Bpmn.js使用&#xff08;仅查看版&#xff09; 下载 npm install bpmn-js创建一个 Dom 节点来挂载画布元素。 <a-tabs v-model:activeKey"activeKey" change"tabsChange"><a-tab-pane key"1" tab"审批记录"><a-tabl…

保护宝贵的历史财富——博物馆文物管理

文物是一个国家的瑰宝&#xff0c;承载着历史的记忆和文化的传承及精髓。为了保护这些珍贵的文化遗产&#xff0c;仓库管理尤为重要。仓库管理的目的是确保文物的完整性、安全性和可持续保护&#xff0c;并为研究、展览和教育提供支持。 首先&#xff0c;文物仓库管理注重文物的…

前端css中径向渐变(radial-gradient)的使用

前端css中径向渐变的使用 一、前言二、主要内容说明&#xff08;一&#xff09;、径向渐变的形状1.椭圆形渐变&#xff08;ellipse&#xff09;&#xff0c;源码12.源码1运行效果3.圆形渐变&#xff08;circle&#xff09;&#xff0c;源码24.源码2运行效果 &#xff08;二&…

Windows安装RabbitMQ教程(附安装包)

需要两个安装包 Erlang 安装包: https://download.csdn.net/download/Brevity6/89274663 (自己从官网下载也可以) RabbitMQ Windows 安装包&#xff1a; https://download.csdn.net/download/Brevity6/89274667 (自己从官网下载也可以) Erlang安装 Erlang安装傻瓜式下一…

数据结构05:树与二叉树 习题01[C++]

考研笔记整理&#xff0c;本篇作为树与二叉树的基本概念习题&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 之前的博文链接在此&#xff1a;数据结构05&#xff1a;树与二叉树[C]-CSDN博客~&#x1f95d;&#x1f95d; 第1版&#xff1a;王道书的课后习题~&#x1…

DenseCLIP论文讲解

文章目录 简介方法总体框架 &#xff08;Language-Guided Dense Prediction&#xff09;上下文感知提示 &#xff08;Context-Aware Prompting&#xff09;应用实例 论文&#xff1a;DenseCLIP: Language-Guided Dense Prediction with Context-Aware Prompting 代码&#xff1…

最全软件测试面试问题和回答,适合全文背诵

求职&#xff0c;类似于打仗&#xff0c;是一场挑战自己的战斗&#xff0c;也是一场跟用人单位的博弈&#xff0c;更是一场千人过独木桥的厮杀、混战。《孙子谋攻篇》中早就说了&#xff1a;"知己知彼&#xff0c;百战不殆&#xff1b;不知彼而知己&#xff0c;一胜一负&a…

python数据分析——数据的选择和运算

数据的选择和运算 前言一、数据选择NumPy的数据选择一维数组元素提取示例 多维数组行列选择、区域选择示例 花式索引与布尔值索引布尔索引示例一示例二 花式索引示例一示例二 Pandas数据选择Series数据获取DataFrame数据获取列索引取值示例一示例二 取行方式示例loc() 方法示例…

error LNK2001: 无法解析的外部符号 “__declspec(dllimport) public: __cdecl ......

运行程序时&#xff0c;报如上图所示错误&#xff0c;其中一条是&#xff1a; ReflectionProbe.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl osg::Object::Object(bool)" (__imp_??0ObjectosgQEAA_NZ) 报这个错误一般是因为…

10.轮转数组

文章目录 题目简介题目解答解法一&#xff1a;使用额外的数组代码&#xff1a;复杂度分析&#xff1a; 解法二&#xff1a;数组反转代码&#xff1a;复杂度分析&#xff1a; 题目链接 大家好&#xff0c;我是晓星航。今天为大家带来的是 轮转数组 相关的讲解&#xff01;&#…

Gradle基础学习(六) 认识任务Task

理解Gradle中的任务 Gradle的构建过程基于任务&#xff08;Task&#xff09;的概念&#xff0c;而每个任务都可以包含一个或多个动作&#xff08;Action&#xff09;。 任务是构建中执行的一些独立的工作单元&#xff0c;例如编译类、创建JAR、生成Javadoc或将存档发布到仓库…