Optional类的使用 java8(附代码)

🍰 个人主页:_小白不加班__
🍞文章有不合理的地方请各位大佬指正。
🍉文章不定期持续更新,如果我的文章对你有帮助➡️ 关注🙏🏻 点赞👍 收藏⭐️

文章目录

  • 一、什么是Optional?
  • 二、Optional常用api
      • 1.Optional.empty()
      • 2.Optional.of()
      • 3.Optional.ofNullable
      • 4.map
      • 5.flatMap
      • 6.ifPresent
      • 7.get
      • 8.orElse
      • 9.orElseGet
      • 10.orElseThrow
      • 11.filter`
  • 三、其他问题:
      • 1. Optional为何不可在 类中使用?
      • 2.为何避免使用 基础类型的Optional对象?

一、什么是Optional?

在 Java 8 中,Optional 是一个新的容器类,它被引入以更好地处理可能为 null 的值。
Optional 的主要目的是提供一种优雅的方式来避免空指针异常(NullPointerException)

二、Optional常用api

在这里插入图片描述

1.Optional.empty()

创建一个空的Optional对象
Optional<Car> optCar = Optional.empty();

2.Optional.of()

  1. 静态工厂方法,依据非空值创建对象
  2. 如果car是一个null,这段代码会立即抛出一个NullPointerException
    Optional<Car> optCar = Optional.of(car);

3.Optional.ofNullable

  1. 创建一个允许null值的Optional 对象
  2. 如果carnull,那么得到的Optional对象就是个空对象。
    Optional<Car> optCar = Optional.ofNullable(car);

4.map

  1. Optional 是一个容器类,用于封装可能为 null 的值。
  2. 不是一个传统的容器,如 List、Set、Map,只能存储一个值或者不存储任何值(即为空)
  3. Optional对象包含一个非空值,那么map方法会根据提供的函数,返回一个新的Optional对象,该对象包含转换后的值。
  4. 如果原始Optional对象为空,则返回一个空的Optional对象
// 保险
@Data
public class Insurance {private String name;public String getName() {return name;}
}
@Test
public void test1() {Insurance insurance = new Insurance();insurance.setName("阳光保险");Optional<String> name = Optional.ofNullable(insurance).map(Insurance::getName);System.out.println(name);//阳光保险
}
@Test
public void test2() {Insurance insurance = new Insurance();Optional<String> name = Optional.ofNullable(insurance).map(Insurance::getName);System.out.println(name);//Optional.empty
}

5.flatMap

flatMap操作中使用 处理嵌套的 Optional 类型。
在这里插入图片描述

// 保险
@Data
public class Insurance {private String name;public String getName() {return name;}
}
@Test
public void test3() {Optional<Insurance> optInsurance = Optional.ofNullable(new Insurance());Optional<String> name = optInsurance.flatMap(insurance -> {System.out.println("insurance");//insurancereturn Optional.ofNullable(insurance.getName());});System.out.println(name);/*结果:insuranceOptional.empty*/
}

6.ifPresent

  1. 存在就执行使用该值的方法调用
@Test
public void test4() {Optional<Insurance> optInsurance = Optional.ofNullable(new Insurance());optInsurance.ifPresent(insurance -> System.out.println(insurance));
}

7.get

  1. 如果变量存在,它直接返回封装的变量值
  2. 否则就抛出一个NoSuchElementException异常
  3. 一般不用单独使用,除非确定值存在,不然失去了Optional的意义
@Test
public void test4() {Insurance insurance = new Insurance();insurance.setName("保险");Optional<Insurance> optInsurance = Optional.ofNullable(insurance);System.out.println(optInsurance.get().getName());//保险   
}

8.orElse

在 Optional对象不包含值时提供一个默认值。

public String str() {//模拟取值return null;
}
/**
* orElse
*/
@Test
public void test5() {String s = Optional.ofNullable(str()).orElse("default");System.out.println(s);//default
}

9.orElseGet

public String str() {//模拟取值return null;
}
/**** orElseGet*/
@Test
public void test6() {Supplier<String> supplier = () -> {return "default";};String s = Optional.ofNullable(str()).orElseGet(supplier);System.out.println(s); // default
}

10.orElseThrow

指定Supplier抛出的异常

 public String strData() {return null;
}
/*** orElseThrow*/
@Test
public void test7() {try {Optional.ofNullable(strData()).orElseThrow(RuntimeException::new);} catch (RuntimeException e) {System.out.println("RuntimeException");}//结果RuntimeException
}

11.filter`

是否满足谓词,满足返回包含该值的Optional对选,否则返回Optional.empty

@Test
public void test8() {Insurance insurance = new Insurance();insurance.setName("A保险");Optional<Insurance> optInsurance = Optional.ofNullable(insurance);optInsurance.filter((Insurance i) -> "A保险".equals(i.getName())).ifPresent(System.out::println);
}

三、其他问题:

1. Optional为何不可在 类中使用?

  • 由于Optional类设计时未实现 Serializable接口,无法序列化
    反例:
public class Person {private Optional<Car> car;public Optional<Car> getCar() { return car; }
}

2.为何避免使用 基础类型的Optional对象?

  • 除了Optional还提供 OptionalInt、OptionalLong、OptionalDouble 基础类型对象虽然提高了一些性能,但是灵活性大大较低
  • 基础类型Optional不支持map flatMap filter中间操作

参考:《java8 实战》

🍉文章不定期持续更新,如果我的文章对你有帮助➡️ 关注🙏🏻 点赞👍 收藏⭐️

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

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

相关文章

科研绘图系列:R语言和弦图 (Chord diagram)

介绍 和弦图(Chord Diagram)是一种用于展示多个实体之间相互关系的数据可视化方法。它通常用于表示网络或系统中不同节点(实体)之间的连接强度或流量。和弦图由一个圆形布局组成,每个节点在圆周上占据一个扇形区域,节点之间的连接通过圆内的线条(和弦)来表示。 特点:…

数据结构第七讲:栈和队列OJ题

数据结构第七讲&#xff1a;栈和队列OJ题 1.有效的括号2.用队列实现栈3.用栈实现队列4.设计循环队列 1.有效的括号 链接: OJ题目链接 typedef char StackDataType;typedef struct Stack {StackDataType* arr;//使用一个指针来指向开辟的数组int capacity;//保存数组的空间大…

springboot爱宠屋宠物商店管理系统-计算机毕业设计源码52726

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…

【机器学习】正规方程的简单介绍以及如何使用Scikit-Learn实现基于正规方程的闭式解线性回归

引言 Scikit-learn 是一个开源的机器学习库&#xff0c;它支持 Python 编程语言。它提供了多种机器学习算法的实现&#xff0c;并用于数据挖掘和数据分析 文章目录 引言一、正规方程的定义二、正规方程的原理三、使用 Scikit-Learn 实现基于正规方程的闭式解线性回归3.1 工具3.…

实验15.多线程调度

简介 实验.多线程调度 内核线程 1.在时钟中断函数中处理中&#xff0c;减少当前线程pcb的tick&#xff0c;tick为0则启动调度2.调度&#xff0c;把当前线程pcb放入就绪对立队尾&#xff0c;把就绪线程队首拿出来执行主要代码 引导 省略内核 list.h #ifndef __LIB_KERNEL_…

【2024最新】 服务器安装Ubuntu20.04 (安装教程、常用命令、故障排查)持续更新中.....

安装教程&#xff08;系统、NVIDIA驱动、CUDA、CUDNN、Pytorch、Timeshift、ToDesk、花生壳&#xff09; 制作U盘启动盘&#xff0c;并安装系统 在MSDN i tell you下载Ubuntu20.04 Desktop 版本&#xff0c;并使用Rufus制作UEFI启动盘&#xff0c;参考UEFI安装Ubuntu使用GPTU…

mysql 的MHA

mysql 的MHA 什么是MHA 高可用模式下的故障切换&#xff0c;基于主从复制。 单点故障和主从复制不能切换的问题。 至少需要3台。 故障切换过程0-30秒。 vip地址&#xff0c;根据vip地址所在的主机&#xff0c;确定主备。 主 vip 备 vip 主和备不是优先确定的&#xff…

InternLM Linux 基础知识

完成SSH连接与端口映射并运行hello_world.py 创建并运行test.sh文件 使用 VSCODE 远程连接开发机并创建一个conda环境

“pandas”的坑

参考&#xff1a;百度安全验证 本文基于python第三方数据分析库pandas&#xff0c;分享这几天所遇到的3个爬坑的案例&#xff0c;希望对也在爬坑的同学们尽一份绵薄之力&#xff0c;如有错误或者写得不好的地方&#xff0c;烦请指正&#xff0c;谢谢。 01df中startswith的坑 …

led灯什么牌子的质量好?led灯护眼效果好的五款爆品分享

大家在选择led灯的时候&#xff0c;最关心的就是“led灯什么牌子的质量好&#xff1f;”市面上商家推出来的led灯品牌众多&#xff0c;型号以及功能也是令人眼花缭乱的&#xff0c;既然如此&#xff0c;那我们应该如何买到质量过关又好用的led灯呢&#xff1f;接下来我将为大家…

敏感信息泄露wp

1.右键查看网页源代码 2.前台JS绕过&#xff0c;ctrlU绕过JS查看源码 3.开发者工具&#xff0c;网络&#xff0c;查看协议 4.后台地址在robots,拼接目录/robots.txt 5.用dirsearch扫描&#xff0c;看到index.phps,phps中有源码&#xff0c;拼接目录&#xff0c;下载index.phps …

网页封装app:如何将网站转换为移动应用程序?(网页封装app)

随着移动互联网的普及&#xff0c;越来越多的企业开始关注移动应用程序的开发。但是&#xff0c;对于一些小型企业或个人&#xff0c;开发一款移动应用程序可能需要投入大量的时间和金钱。这时&#xff0c;网页封装app就成了一个不错的选择。 app在线封装www,ppzhu.net 什么是…

【AI人工智能】文心智能体,00后疯感工牌生成器,低代码工作流的简单应用以及图片快速响应解决方案,干货满满,不容错过哦

背景 文心智能体平台&#xff0c;开启新一轮活动&#xff0c;超级创造营持续百日活动。 在AI 浪潮席卷的今天&#xff0c;如雨后春笋般丛生的 AI 应用&#xff0c;昭告着时代风口显然已随之到来。 如何能把握住时代红利&#xff0c;占据风口&#xff0c;甚至打造新风向&#x…

探索 Kubernetes 持久化存储之 Longhorn 初窥门径

作者&#xff1a;运维有术星主 在 Kubernetes 生态系统中&#xff0c;持久化存储扮演着至关重要的角色&#xff0c;它是支撑业务应用稳定运行的基石。对于那些选择自建 Kubernetes 集群的运维架构师而言&#xff0c;选择合适的后端持久化存储解决方案是一项至关重要的选型决策。…

因为媳妇的一句话,我做了一个AI画图软件

因为媳妇的一句话&#xff0c;我做了一个AI画图软件 T恤的配图 前些天媳妇参加了一个创业比赛&#xff0c;其中一个比赛任务是参赛成员需要穿主题队服&#xff0c;队服的图案完全需要自己设计&#xff0c;需要独一无二还得漂亮。 问我&#xff1a;“能不能用AI做一张图&#…

Python酷库之旅-第三方库Pandas(052)

目录 一、用法精讲 191、pandas.Series.drop方法 191-1、语法 191-2、参数 191-3、功能 191-4、返回值 191-5、说明 191-6、用法 191-6-1、数据准备 191-6-2、代码示例 191-6-3、结果输出 192、pandas.Series.droplevel方法 192-1、语法 192-2、参数 192-3、功能…

C# 介绍

文章目录 一. 一个简单的helloworld二. 程序结构三. 类型和变量四. 表达式1. f(x)2. []3. typeof4. default5. new6. checked和unchecked7. sizeof8. 移位9. is和as10. null合并 五. 语句六. 类和对象1. 可访问性2. 类型参数3. 基类和派生类4. 字段5. 方法6. 参数7. 扩展方法&a…

53.综合实验:UART接收图像、写入RAM、通过TFT显示

&#xff08;1&#xff09;设计定义&#xff1a;UART_RX模块接收数据&#xff0c;通过写入逻辑写入RAM存储器中&#xff0c;然后通过读取逻辑&#xff0c;从RAM中读出数据&#xff0c;发送给TFT显示屏。 &#xff08;2&#xff09;FPGA逻辑资源有限&#xff0c;因此设置128 * 1…

新生报到系统2024((代码+论文+ppt)

下载在最后 技术栈: ssmmysqljsp 展示: 下载地址: CSDN现在上传有问题,有兴趣的朋友先收藏.正常了贴上下载地址 备注:

docker安装部署elasticsearch7.15.2

docker安装部署elasticsearch7.15.2 1.拉取es镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.2如果不想下载或者镜像拉去太慢可以直接下载文章上面的镜像压缩包 使用镜像解压命令 docker load -i elasticsearch-7-15-2.tar如下图所示就表示镜像解压成…