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()
- 静态工厂方法,依据非空值创建对象
- 如果
car是一个null,这段代码会立即抛出一个NullPointerException
Optional<Car> optCar = Optional.of(car);
3.Optional.ofNullable
- 创建一个允许
null值的Optional对象 - 如果
car是null,那么得到的Optional对象就是个空对象。
Optional<Car> optCar = Optional.ofNullable(car);
4.map
Optional是一个容器类,用于封装可能为 null 的值。- 不是一个传统的容器,如 List、Set、Map,只能存储一个值或者不存储任何值(即为空)
Optional对象包含一个非空值,那么map方法会根据提供的函数,返回一个新的Optional对象,该对象包含转换后的值。- 如果原始
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
- 存在就执行使用该值的方法调用
@Test
public void test4() {Optional<Insurance> optInsurance = Optional.ofNullable(new Insurance());optInsurance.ifPresent(insurance -> System.out.println(insurance));
}
7.get
- 如果变量存在,它直接返回封装的变量值
- 否则就抛出一个
NoSuchElementException异常 - 一般不用单独使用,除非确定值存在,不然失去了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 实战》
🍉文章不定期持续更新,如果我的文章对你有帮助➡️ 关注🙏🏻 点赞👍 收藏⭐️
相关文章:
Optional类的使用 java8(附代码)
🍰 个人主页:_小白不加班__ 🍞文章有不合理的地方请各位大佬指正。 🍉文章不定期持续更新,如果我的文章对你有帮助➡️ 关注🙏🏻 点赞👍 收藏⭐️ 文章目录 一、什么是Optional?二、…...
企业利用AI智能名片S2B2C商城小程序参与社区团购的风险与机遇分析
摘要 在新零售浪潮的推动下,社区团购以其独特的商业模式迅速崛起,成为连接消费者与供应商的重要桥梁。企业纷纷探索如何有效利用这一新兴渠道,以扩大市场份额、提升品牌影响力。AI智能名片S2B2C商城小程序的引入,为企业参与社区团…...
全链路追踪 性能监控,GO 应用可观测全面升级
作者:古琦 01 介绍 随着 Kubernetes 和容器化技术的普及,Go 语言不仅在云原生基础组件领域广泛应用,也在各类业务场景中占据了重要地位。如今,越来越多的新兴业务选择 Golang 作为首选编程语言。得益于丰富的 RPC 框架ÿ…...
深入探索CSS3的Media Query:打造响应式网页设计的利器
在今天的互联网世界中,随着设备种类和屏幕尺寸的多样化,响应式网页设计(Responsive Web Design, RWD)已成为不可或缺的一部分。CSS3中的Media Query正是这一设计理念的实现利器,它允许开发者根据用户的设备特性和屏幕尺…...
DDD(Domain-Driven Design)领域驱动设计
在软件开发中,DDD(Domain-Driven Design,领域驱动设计)是一种方法论,它强调在开发过程中将业务领域的知识和规则作为核心。DDD的目标是通过理解和建模业务领域来创建更好的软件系统。本文将详细讲解DDD的基本概念、原则…...
基于k8s快速搭建docker镜像服务的demo
基于k8s快速搭建docker镜像服务的demo 一、环境准备 如标题,你需要环境中有和2个平台,并且服务器上也已经安装好docker服务 接下来我来构建一个docker镜像,然后使用harbork8s来快速部署服务demo 二、部署概述 使用docker构建镜像&#x…...
“论大数据处理架构及其应用”写作框架,软考高级论文,系统架构设计师论文
论文真题 大数据处理架构是专门用于处理和分析巨量复杂数据集的软件架构。它通常包括数据收集、存储、处理、分析和可视化等多个层面,旨在从海量、多样化的数据中提取有价值的信息。Lambda架构是大数据平台里最成熟、最稳定的架构,它是一种将批处理和流…...
tarojs项目启动篇
TaroJS 是一个开放式跨端开发解决方案,使用 React 语法规范来开发多端应用(包括小程序、H5、React Native 等)。它可以帮助开发者高效地构建出在不同端上运行一致的应用。以下是启动 TaroJS 项目(本来就有的旧项目)的步…...
Maven打包时将本地 jar 加入 classpath
在使用 maven 编译项目时,我们有时候会需要引入本地的 jar 包作为依赖(不部署到本地仓库),一般会使用 scope 为 system 的标签来引入,如下所示: <dependency><groupId>com.example</groupI…...
Spring Boot打出的jar包为什么可以独立运行
闲来无事,浏览网页看到有人说jar包为什么可以独立运行,想起前端时间写的jar打包后无法正常运行处理。jar解压缩后有多个文件夹,内部存放运行所需jar包和一些配置文件,本文做一个简单介绍。 JAR包和WAR包区别 在Java开发中&#…...
“微软蓝屏”事件:网络安全与稳定性的深刻反思
🌈所属专栏:【其它】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您的点…...
【技术升级】Docker环境下Nacos平滑升级攻略,安全配置一步到位
目前项目当中使用的Nacos版本为2.0.2,该版本可能存在一定的安全风险。软件的安全性是一个持续关注的问题,尤其是对于像Nacos这样的服务发现与配置管理平台,它在微服务架构中扮演着核心角色。随着新版本的发布,开发团队会修复已知的…...
[题解]CF1401E.Divide Square(codeforces 05)
题目描述 There is a square of size 106106106106 on the coordinate plane with four points (0,0)(0,0) , (0,106)(0,106) , (106,0)(106,0) , and (106,106)(106,106) as its vertices. You are going to draw segments on the plane. All segments are either horizonta…...
软考高级第四版备考--第32天(新一代信息技术及应用)
1、物联网 1.1技术基础 1.1.1感知层:由各种传感器构成,包括温度传感器,二维码标签、RFID标签和读写器,摄像头,GPS等感知终端。感知层是物联网识别物体、采集信息的来源。 1.1.2网络层:由各种网络&#x…...
【RabbitMQ】MQ相关概念
一、MQ的基本概念 定义:MQ全称为Message Queue,是一种提供消息队列服务的中间件,也称为消息中间件。它允许应用程序通过读写队列中的消息来进行通信,而无需建立直接的连接。作用:主要用于分布式系统之间的通信&#x…...
【MySQL是怎样运行的 | 第二篇】MySQL三大日志文件
文章目录 2.MySQL三大日志文件2.1日志文件列表2.1.1 redo log2.1.2 bin log2.1.3 undo log 2.2redo log日志详讲2.3 binglog和redo log有什么区别?2.4一条更新语句的执行过程 2.MySQL三大日志文件 2.1日志文件列表 redo log:重做日志,记录了…...
视图、存储过程、触发器
一、视图 视图是从一个或者几个基本表(或视图)导出的表。它与基 本表不同,是一个虚表,视图只能用来从查询,不能做增删改(虚拟的表) 1.创建视图 创建视图的语法: create view 视图名【view_xxx / v_xxx】 a…...
【学习笔记】解决Serial Communication Library编译问题
【学习笔记】解决编译 Serial Communication Library 时的 Catkin 依赖问题 Serial Communication Library 是一个用 C 编写的用于连接类似 rs-232 串口的跨平台库。它提供了一个现代的 C 接口,它的工作流程设计在外观和感觉上与 PySerial 相似,但串口速…...
在 Windows 环境下实现负载均衡:提升系统性能与可靠性的关键技术
Windows 环境下的负载均衡:提升系统性能与可靠性的关键技术 负载均衡(Load Balancing)是现代网络架构中不可或缺的一部分,通过将请求分配到多台服务器上来提高系统的性能和可靠性。本文将介绍在 Windows 环境下使用负载均衡的基本…...
【Linux】-----工具篇(自动化构建工具make/makefile)
目录 前言 一、是什么? 二、怎么样的? 三、原理及细节 图解代码 细节1:make工作规则 ①依赖文件存在 ②依赖文件不存在 ③依赖文件列表为空(特殊) .PHONY关键字 细节2:makefile识别程序需要重新编译? 四、…...
ROS路径规划实战:用move_base让机器狗在Gazebo中自主导航(避坑指南)
ROS路径规划实战:用move_base让机器狗在Gazebo中自主导航(避坑指南) 当机器狗在仿真环境中流畅地绕过障碍物走向目标点时,那种成就感就像看着自家宠物第一次成功接住飞盘。作为ROS开发者,掌握move_base实现自主导航的能…...
终极指南:使用 crypto-js 测试套件确保你的加密功能100%可靠
终极指南:使用 crypto-js 测试套件确保你的加密功能100%可靠 【免费下载链接】crypto-js JavaScript library of crypto standards. 项目地址: https://gitcode.com/gh_mirrors/cr/crypto-js 在Web开发中,你有没有遇到过这样的场景:你…...
RMBG-2.0模型量化压缩:减小体积提升速度
RMBG-2.0模型量化压缩:减小体积提升速度 1. 引言 抠图工具RMBG-2.0确实效果惊艳,但原版模型动不动就几个GB的大小,在普通电脑上跑起来慢吞吞的,更别说在手机或边缘设备上部署了。如果你也遇到过模型太大、推理太慢的问题&#x…...
告别默认ResNet-50:为你的病理图像特征提取,升级CLAM+CONCH v1.5的保姆级指南
告别默认ResNet-50:为你的病理图像特征提取,升级CLAMCONCH v1.5的保姆级指南 在病理图像分析领域,特征提取的质量直接影响下游任务的性能表现。许多研究者发现,使用默认的ImageNet预训练ResNet-50模型提取的特征,往往…...
Tao-8k辅助学术研究:从研究想法到LateX论文草稿
Tao-8k辅助学术研究:从研究想法到LateX论文草稿 作为一名研究生或科研人员,你是否经常被这样的场景困扰:脑子里有个模糊的研究想法,却不知如何系统化地展开;面对海量文献,梳理综述耗时耗力;实验…...
ArcGIS核密度分析实战:基于上海市餐饮POI的商业热点识别
1. 核密度分析能帮你做什么? 如果你正在考虑开一家餐厅,或者想了解上海哪些区域餐饮业最发达,核密度分析就是你的好帮手。简单来说,这个技术可以把一堆分散的餐饮店位置数据,变成一张直观的"热度地图"。我去…...
Piping Server开发者指南:如何基于流传输构建自己的应用
Piping Server开发者指南:如何基于流传输构建自己的应用 【免费下载链接】piping-server Infinitely transfer between every device over pure HTTP with pipes or browsers 项目地址: https://gitcode.com/gh_mirrors/pi/piping-server Piping Server是一个…...
终极Node.js无头浏览器测试指南:Zombie.js与Mocha集成实战
终极Node.js无头浏览器测试指南:Zombie.js与Mocha集成实战 【免费下载链接】zombie Insanely fast, full-stack, headless browser testing using node.js 项目地址: https://gitcode.com/gh_mirrors/zo/zombie 在当今快速发展的Web开发领域,Zomb…...
终极指南:如何在5分钟内完成你的第一个React Native动画模态框
终极指南:如何在5分钟内完成你的第一个React Native动画模态框 【免费下载链接】react-native-modal An enhanced, animated, customizable Modal for React Native. 项目地址: https://gitcode.com/gh_mirrors/re/react-native-modal React Native动画模态框…...
VideoAgentTrek Screen Filter在运维监控中的应用:自动过滤服务器录屏中的敏感信息
VideoAgentTrek Screen Filter在运维监控中的应用:自动过滤服务器录屏中的敏感信息 想象一下这个场景:你作为运维工程师,刚刚处理完一个棘手的线上故障。为了复盘和分享经验,你需要把整个排查过程的服务器操作录屏发给同事或者上…...
