3、函数式编程--Optional

news2024/12/23 23:14:43

目录

    • 4. Optional
      • 4.1 概述
      • 4.2 使用
        • 4.2.1 创建对象
          • Optional
            • ofNullable()
            • of()
            • empty()
        • 4.2.2 安全消费值
          • ifPresent
        • 4.2.3 获取值
          • get()
        • 4.2.4 安全获取值
          • orElseGet
          • orElseThrow
        • 4.2.5 过滤
          • filter
        • 4.2.6 判断
          • isPresent
        • 4.2.7 数据转换
          • map

4. Optional

4.1 概述

​ 我们在编写代码的时候出现最多的就是空指针异常。所以在很多情况下我们需要做各种非空的判断。

​ 例如:

        Author author = getAuthor();
        if(author!=null){
            System.out.println(author.getName());
        }

​ 尤其是对象中的属性还是一个对象的情况下。这种判断会更多。

​ 而过多的判断语句会让我们的代码显得臃肿不堪。

​ 所以在JDK8中引入了Optional,养成使用Optional的习惯后你可以写出更优雅的代码来避免空指针异常。

​ 并且在很多函数式编程相关的API中也都用到了Optional,如果不会使用Optional也会对函数式编程的学习造成影响。

所谓的Optional 相当于是把一个数据封装成了Optional对象当中的一个属性。然后我们就去调用 Optional对象相关的方法来进行非空判断。

4.2 使用

4.2.1 创建对象
Optional

就是用方法把数据封装成一个Optional对象,

方法有 Optional.ofNullable() 和 Optional.of() 和 Optional.empty()

Optional就好像是包装类,可以把我们的具体数据封装Optional对象内部。然后我们去使用Optional中封装好的方法操作封装进去的数据就可以非常优雅的避免空指针异常。

ofNullable()

​ 我们一般使用Optional静态方法ofNullable来把数据封装成一个Optional对象。无论传入的参数是否为null都不会出现问题。

        Author author = getAuthor();
        Optional<Author> authorOptional = Optional.ofNullable(author);

​ 你可能会觉得还要加一行代码来封装数据比较麻烦。但是如果改造下getAuthor方法,让其的返回值就是封装好的Optional的话,我们在使用时就会方便很多。

​ 而且在实际开发中我们的数据很多是从数据库获取的。Mybatis从3.5版本可以也已经支持Optional了。我们可以直接把dao方法的返回值类型定义成Optional类型,MyBastis会自己把数据封装成Optional对象返回。封装的过程也不需要我们自己操作。

of()

​ 如果你确定一个对象不是空的则可以使用Optional静态方法of来把数据封装成Optional对象。

        Author author = new Author();
        Optional<Author> authorOptional = Optional.of(author);

​ 但是一定要注意,如果使用of的时候传入的参数必须不为null。(尝试下传入null会出现什么结果)

empty()

​ 如果一个方法的返回值类型是Optional类型。而如果我们经判断发现某次计算得到的返回值为null,这个时候就需要把null封装成Optional对象返回。这时则可以使用Optional静态方法empty来进行封装。

	Optional.empty()

所以最后你觉得哪种方式穿件对象会更方便呢?
ofNullable

ofNullable()分析图

在这里插入图片描述

分析图

在这里插入图片描述

分析图:方法返回的对象直接设置成Optional类型就可以了

在这里插入图片描述
Optional.of() 分析图

在这里插入图片描述

4.2.2 安全消费值
ifPresent

​ 我们获取到一个Optional对象后肯定需要对其中的数据进行使用。这时候我们可以使用其ifPresent方法对来消费其中的值。

​ 这个方法会判断其内封装的数据是否为空,不为空时才会执行具体的消费代码。这样使用起来就更加安全了。

​ 例如,以下写法就优雅的避免了空指针异常。

        
//把数据封装成一个Optional对象,无论传入的参数是否为null都不会出现问题
Optional<Author> authorOptional = Optional.ofNullable(getAuthor());

//判断该对象的属性值是否为null,为null就不执行System.out.println(author.getName())这行代码
authorOptional.ifPresent(author -> System.out.println(author.getName()));

4.2.3 获取值
get()

​ 如果我们想获取值自己进行处理可以使用get方法获取,但是不推荐。因为当Optional内部的数据为空的时候会出现异常。

分析图
在这里插入图片描述

4.2.4 安全获取值

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

orElseGet

获取数据并且设置数据为空时的默认值。如果数据不为空就能获取到该数据。如果为空则根据你传入的参数来创建对象作为默认值返回。

        Optional<Author> authorOptional = Optional.ofNullable(getAuthor());
        Author author1 = authorOptional.orElseGet(() -> new Author());

分析图 获取到的对象为null和不为null的区别

在这里插入图片描述

orElseThrow

获取数据,如果数据不为空就能获取到该数据。如果为空则根据你传入的参数来创建异常抛出。

        Optional<Author> authorOptional = Optional.ofNullable(getAuthor());
        try {
            Author author = authorOptional.orElseThrow((Supplier<Throwable>) () -> new RuntimeException("author为空"));
            System.out.println(author.getName());
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }

分析图,获取到的对象为null就直接抛自定义的异常

在这里插入图片描述

4.2.5 过滤
filter

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

不符合条件的话,原本有数据的对象,也会变成没有数据的对象了

在这里插入图片描述

4.2.6 判断
isPresent

​ 我们可以使用isPresent方法进行是否存在数据的判断。如果为空返回值为false,如果不为空,返回值为true。但是这种方式并不能体现Optional的好处,更推荐使用ifPresent方法

如果在做if判断的时候,对象为null,那么就不会进入后续的操作

在这里插入图片描述

4.2.7 数据转换
map

​ Optional还提供了map可以让我们的对数据进行转换,并且转换得到的数据也还是被Optional包装好的,保证了我们的使用安全。

例如我们想获取作家的书籍集合。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

伯俊ERP和金蝶云星空接口打通对接实战

伯俊ERP和金蝶云星空接口打通对接实战 对接系统伯俊ERP 伯俊科技&#xff0c;依托在企业信息化建设方面的领先技术与实践积累&#xff0c;致力于帮助企业实现全渠道一盘货。伯俊提供数字经营的咨询与系统实施&#xff0c;助力企业信息化升级、加速数字化转型&#xff0c;覆盖零…

信息检索与数据挖掘|(四)索引构建

目录 &#x1f4da;硬件基础 &#x1f4da;基于块的排序索引方法 &#x1f407;BSBI算法(blocked sort-based indexing) &#x1f4da;内存式单遍扫描索引构建方法 &#x1f407;SPIMI算法(single-pass in-memory indexing) &#x1f4da;分布式索引构建方法 &#x1f4d…

Cesium Vue(二)— 基础配置

1. 修改默认配置 设置cesium token // 设置cesium token 官网上申请 Cesium.Ion.defaultAccessToken "token";设置默认视角 //设置默认视角 Cesium.Camera.DEFAULT_VIEW_RECTANGLE Cesium.Rectangle.fromDegrees(// 西边的经度89.5,// 南边维度20.4,// 东边经度1…

手把手 java springboot 整合 JUnit进行单元测试

首先 我们在pom.xml中注入JUnit工具 <dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.8.1</version><scope>test</scope> </dependency>然后 我们顺便找…

DM工作笔记-DATEADD(指定日期添加n个时间段)函数和其他时间函数

达梦官方文档已经说得很清楚了&#xff0c;在此仅记录下笔记&#xff0c;方便以后进行查阅。 DATEADD对应的相关文档如下&#xff1a; 这里说明下CREATE_TIME是TIMESTAMP类型。 如下例子&#xff1a; select CREATE_TIME from TEST_TABLE 运行截图如下&#xff1a; 现在有个…

企业数字化转型建设过程中需要哪些能力?

企业数字化转型是一个全面的过程&#xff0c;涉及利用数字技术和战略从根本上改变组织的运营方式和为客户提供价值的方式。为了成功进行这一转型&#xff0c;需要几个关键能力&#xff1a; 1.愿景和领导力&#xff1a;清晰的愿景和强有力的领导力对于指导转型至关重要。领导层…

CV计算机视觉每日开源代码Paper with code速览-2023.10.16

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【目标检测】Rank-DETR for High Quality Object Detecti…

.NET 8使用牛逼的AOT发布ASP.NET Core应用

简介 .NET AOT编译是一种.NET运行时的编译方式&#xff0c;它与传统的JIT编译方式不同。在传统的JIT编译中&#xff0c;.NET应用程序的代码在运行时才会被编译成本地机器码&#xff0c;而在AOT编译中&#xff0c;代码在运行之前就被提前编译成本地机器码。这样可以在代码运行的…

暴露你系统安全的黑暗角落:常见端口漏洞大合集!

目录 前言 一、远程管理端口 1.22 端口&#xff08;SSH&#xff09; 2.23 端口&#xff08;Telnet&#xff09; 3.3389 端口&#xff08;RDP&#xff09; 4.5632 端口&#xff08;Pcanywhere&#xff09; 5.5900 端口&#xff08;VNC&#xff09; 二、Web中间件/服务端口 6.109…

构建强大监控系统:使用Linux Zabbix和cpolar实现远程访问

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 目录 1. Linux 局域网访问Zabbix 2. Linux 安装cpolar 3. 配置Zabbix公网访问地址 4. 公网远程访问Zabbix 5. …

基于Java的健身运动网站系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

SQL sever中的触发器

目录 一、触发器概念 二、触发器优缺点 2.1优点&#xff1a; 2.2缺点&#xff1a; 三、触发器种类 四、触发器创建 4.1创建DML触发器 4.2创建DDL触发器 4.3创建登录触发器 五、触发器管理 5.1查看触发器 5.1.1.使用sp_helptext存储过程查看触发器 5.1.2.获取数据库…

367. 有效的完全平方数

367. 有效的完全平方数 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;1. 二分查找2. 使用内置的库函数3. 暴力遍历4. 牛顿迭代 原题链接&#xff1a; 367. 有效的完全平方数 https://leetcode.cn/problems/valid-perfect-square/submi…

八、添加和风天气插件

简介 给个人首页简介添加一个查看天气的免费功能插件 和风天气插件。⭐️ 欢迎访问个人的简历网站预览效果 本章涉及修改与新增的文件&#xff1a;index.html、First.vue 、App.vue 一、注册账号 登录和风天气官网&#xff0c;注册个人账号 和风天气官网 选择你想要的插件…

idea不识别yaml文件导致,配置文件点击跳转不了类

文章目录 场景确认的idea安装了ymal插件,确认你的配置文件是yml格式的还是ymal格式的然后在项目配置中看看是否有对应的后缀.最后看看在项目模块里面有没有spring模块跟对应的配置文件,如果没有就要添加这样点击配置文件就能跳转到对应的实体类了 场景 在使用idea时&#xff0…

百题千解计划【CSDN每日一练】LLM大语言模型:必练选择题及解析 | “等差数列”多解法:Python、Java、C语言、C++...

月落乌啼霜满天,江枫渔火对愁眠。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌟[2] 2022年度博客之星人工智能领域TOP4🌟 🏅[3] 阿里云社区特邀专家博主🏅 🏆[4] CSDN-人工智能领域优质创作者🏆 📝[5] …

面试题:当你的JVM 堆内存溢出后,其他线程是否可继续工作?

最近网上出现一个美团面试题&#xff1a;“一个线程OOM后&#xff0c;其他线程还能运行吗&#xff1f;” 我看网上出现了很多不靠谱的答案。这道题其实很有难度&#xff0c;涉及的知识点有jvm内存分配、作用域、gc等&#xff0c;不是简单的是与否的问题。 由于题目中给出的OO…

【黑马程序员】机器学习

&#xff08;一&#xff09;机器学习概述 一、机器学习算法分类 1、监督学习&#xff1a; &#xff08;1&#xff09;目标值是类别&#xff1a;分类问题 k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归 &#xff08;2&#xff09;目标值是连续型的数据&#xff1a;回归…

【吞噬星空】爽翻,徐欣喜提永恒之体,罗峰秒杀败类,阿特金磕头认错

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 吞噬星空动画第89集终于更新了&#xff0c;阿特金三大巨头的好日子到头了&#xff0c;从他们对徐欣出手的那一刻&#xff0c;就已经有取死之道。如今罗峰强势回归&#xff0c;上演复仇戏码&#xff0c;让大家看…

故障诊断实验台 | PT500mini轴承齿轮箱转子故障实验台

故障诊断实验台 | PT500mini轴承齿轮箱转子故障实验台 1 实验台简介2 实验台功能3 实验台技术清单4 价格 很多同学因为实验数据而被困扰&#xff0c;目前数据来源有3方面&#xff0c;公开实验数据集、校企合作项目实际数据、自制实验台数据。 公开实验数据集被用烂了&#xff0…