Java中关于Optional的 orElse 操作,以及 orElse 与 orElseGet 的区别
文章目录
- 1. 大概说明
- 2. 详细分析
- 2.1 .orElse 操作
- 2.2 .orElse 的作用:避免空指针异常
- 2.3 为什么要用?
- 2.4 orElseGet如何使用
- 2.5 orElse和orElseGet的区别
1. 大概说明
这篇文章的目的是为了说明:
- orElse 如何使用
- orElseGet 如何使用
- 两者的区别
备注:orElse 可能导致 NullPointerException,当 orElse 的参数是间接计算得来的时候。虽然这种说法有点牵强(因为并不是orElse导致了空指针异常),但是使用 orElseGet 确实可以避免这种情况。
2. 详细分析
2.1 .orElse 操作
先看个例子:
Optional<String> optional = Optional.empty(); System.out.println(optional.isPresent); // ---->输出:false // 返回 false,表示 Optional 里没有值。解析:
Optional.empty()代表 一个空的 Optional 实例,即Optional没有值。Optional.ofNullable(null)等价于Optional.empty()。
2.2 .orElse 的作用:避免空指针异常
- 如果
Optional为空(即Optional.empty()),就返回orElse()里提供的默认值。 - 如果
Optional有值,就直接返回这个值,不执行orElse()提供的默认值。
注意:不管 Optional 为不为空,这个值都会创建,只不过为空时,才使用
// 举例:当Optional为空时,orElse()才会触发
String result = Optional.ofNullable(null).orElse("默认值");
System.out.println(result); // ---->输出:默认值
// 再举个例子:
Map<Long, List<String>> map = new HashMap<>();
map.put(1L, Arrays.asList("A", "B", "C"));List<String> result = Optional.ofNullable(map.get(1L)).orElse(Collections.emptyList()); // 为null就返回 空列表
System.out.println(result); // ---->输出:[A, B, C] (orElse() 没起作用)
2.3 为什么要用?
List<String> result = Optional.ofNullable(map.get(0L)).orElse(Collections.emptyList()).stream();
如果 map.get(0L) == null,那么:
- 不加
.orElse(Collections.emptyList())→.stream()会报NullPointerException❌ - 加了
.orElse(Collections.emptyList())→.stream()能正常执行 ✅
2.4 orElseGet如何使用
再来看看 orElseGet 中如何使用:
orElseGet 作用:获取数据并且设置数据为空时的默认值。如果数据不为空就能获取到该数据;如果为空则返回传入的参数来创建对象。
具体的使用案例可看下图:


2.5 orElse和orElseGet的区别
orElse() 和 orElseGet() 都是Optional 类中的方法,用于在 Optional 为空时提供默认值。但它们的区别在于 默认值的获取方式:
1、orElse(T other)
- 直接传递一个默认值
- 即使
Optional里有值,也会创建 other 对象,但不会使用它 - 适用于默认值创建代价较低的情况
2、orElseGet(Supplier<? extends T> supplier)
- 传递的是一个
Supplier(懒加载:只有需要的时候才会创建)接口,它是一个函数式接口,形式是这样的:()->{ return computedResult },即入参为空,有返回值(任意类型的) - 仅当
Optional为空时才会执行supplier.get(),不会提前创建默认值 - 适用于默认值创建代价较高的情况
看个例子:
class User {// 中文名private String chineseName;// 英文名private EnglishName englishName;
}class EnglishName {// 全名private String fullName;// 简写private String shortName;
}
假如我们现在有 User 类,用户注册账号时,需要提供自己的中文名或英文名,或都提供,我们抽象出一个EnglishName 类,它包含英文名的全名和简写(因为有的英文名确实太长了)。现在,我们希望有一个User.getName() 方法,它可以像下面这样实现:
class User {// ... 之前的内容public String getName1() {return Optional.ofNullable(chineseName).orElse(englishName.getShortName());}public String getName2() {return Optional.ofNullable(chineseName).orElseGet(() -> englishName.getShortName());}
}
写了两个版本,分别使用 orElse 和 orElseGet。现在,你可以看出 getName1() 方法有什么风险了吗?它会出现空指针异常吗?----> 是的。当用户只提供了中文名时,此时 englishName 属性是 null,但是在 orElse 中,englishName.getShortName()总是会执行。而在 getName2() 中,这个风险却没有。
再举个例子:
public class Test {public static void main(String[] args) {System.out.println("orElse() 的情况:");String result1 = Optional.ofNullable("实际值").orElse(test2());System.out.println("最终结果: " + result1);System.out.println("orElseGet() 的情况:");String result2 = Optional.ofNullable("实际值").orElseGet(() -> test2());System.out.println("最终结果: " + result2);}public static String test2() {System.out.println("执行昂贵的计算...");return "昂贵默认值";}
}
输出:
orElse() 的情况:
执行昂贵的计算...
最终结果: 实际值orElseGet() 的情况:
最终结果: 实际值
至此,文章结束,记得点赞收藏评论!!!
相关文章:
Java中关于Optional的 orElse 操作,以及 orElse 与 orElseGet 的区别
文章目录 1. 大概说明2. 详细分析2.1 .orElse 操作2.2 .orElse 的作用:避免空指针异常2.3 为什么要用?2.4 orElseGet如何使用2.5 orElse和orElseGet的区别 1. 大概说明 这篇文章的目的是为了说明: orElse 如何使用orElseGet 如何使用两者的…...
TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)
TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave) 一、TCP三次握手(Three-way Handshake)二、TCP四次挥手(Four-way Wave)三、常见问题解答总结为什么三次握手不…...
python学智能算法(八)|决策树
【1】引言 前序学习进程中,已经对KNN邻近算法有了探索,相关文章链接为: python学智能算法(七)|KNN邻近算法-CSDN博客 但KNN邻近算法有一个特点是:它在分类的时候,不能知晓每个类别内事物的具…...
【经验】Orin系列Ubuntu远程桌面:VNC、NoMachine、URDC
1、VNC 1.1 Ubuntu端 1)安装VNC服务器 sudo apt install tigervnc-standalone-server2)安装xfce4 桌面 xfce4 用资源较GNOME ,KDE较少。适合老机器,轻量级桌面。与windows界面环境类似。 sudo apt install xfce4 xfce4-goodies也可以使用其它的桌面系统,可以使用如下命…...
【QT:控件】
目录 控件状态:编辑 geometry : window frame windowlcon: qrc机制 qrc的使用方式: window opacity cursor font: ToolTip focusPolicy: styleSheet: 按钮类控件: PushButton: 给按钮添加图标: 给按钮添加快捷键…...
Python(最新版)集成开发环境PyCharm下载安装详细教程
Python 下载和安装 1.进入Python官网 Download Python | Python.org,点击Downloads,这里以Windows为例 2.选择下载Python 3.13.2 Windows 64位的版本。注意:不能在Windows 7 或更早的版本上使用。 3.打开文件,会自动出现安装界…...
PyTorch 实现 Conditional DCGAN(条件深度卷积生成对抗网络)进行图像到图像转换的示例代码
以下是一个使用 PyTorch 实现 Conditional DCGAN(条件深度卷积生成对抗网络)进行图像到图像转换的示例代码。该代码包含训练和可视化部分,假设输入为图片和 4 个工艺参数,根据这些输入生成相应的图片。 1. 导入必要的库 import …...
【BERT和GPT的区别】
BERT采用完形填空(Masked Language Modeling, MLM)与GPT采用自回归生成(Autoregressive Generation)的差异,本质源于两者对语言建模的不同哲学导向与技术目标的根本分歧。这种选择不仅塑造了模型的架构特性,…...
PTA 7-12 排序
题目描述 给定 n 个(长整型范围内的)整数,要求输出从小到大排序后的结果。 本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下: 数据1:只有1个元素;数据2:11个不…...
uniapp 实现的步进指示器组件
采用 uniapp 实现的一款步进指示器组件,展示业务步骤进度等内容,对外提供“前进”、“后退”方法,让用户可高度自定义所需交互,适配 web、H5、微信小程序(其他平台小程序未测试过,可自行尝试) 可…...
大模型-提示词调优
什么是提示词 提示词(Prompt)在大模型应用中扮演着关键角色,它是用户输入给模型的一段文本指令 。简单来说,就是我们向大模型提出问题、请求或描述任务时所使用的文字内容。例如,当我们想让模型写一篇关于春天的散文&a…...
【k8s002】k8s健康检查与故障诊断
k8s健康检查与故障诊断 一、集群状态检查 检查节点健康状态 kubectl get nodes -o wide # 查看节点状态及基本信息 kubectl describe node <node-name> # 分析节点详细事件(如资源不足、网络异常) kubectl top nodes …...
统计数字字符个数(信息学奥赛一本通-1129)
【题目描述】 输入一行字符,统计出其中数字字符的个数。 【输入】 一行字符串,总长度不超过255。 【输出】 输出为1行,输出字符串里面数字字符的个数。 【输入样例】 Peking University is set up at 1898. 【输出样例】 4 【输出样例】 #in…...
CentOS 6 YUM源切换成国内yum源
由于 CentOS 6 已于 2020 年 11 月进入 EOL(End of Life),官方软件源已不再提供更新,因此你可能会遇到 yum makecache 命令失败的问题。以下是解决该问题的详细步骤: ### 解决方案 1. **备份原有 yum 源文件** bash …...
继承知识点—详细
一:普通写法 package extend_;public class Extends01 {public static void main(String[] args) {Pubil pubil new Pubil();pubil.name"小明";pubil.age18;pubil.testing();pubil.setScore(60);pubil.showInfo();System.out.println("-----------…...
设备管理VTY(Telnet、SSH)
实验目的:物理机远程VTY通过telnet协议登录AR1,ssh协议登录AR2和sw 注意配置Cloud1: 注意!!博主的物理机VMnet8--IP:192.168.160.1,所以AR1路由0/0/0端口才添加IP:192.168.160.3,每个…...
Linux 中 Git 使用指南:从零开始掌握版本控制
目录 1. 什么是 Git? Git 的核心功能: 2. Git 的安装 Ubuntu/Debian 系统: 验证安装: 3.gitee库 4. Git 的首次配置 配置用户名和邮箱: 查看配置: 5. Git 的基本使用 初始化仓库 添加文件到暂存区…...
Linux 中的 likely 和 unlikely
1. 源码 # define likely(x) __builtin_expect(!!(x), 1) # define unlikely(x) __builtin_expect(!!(x), 0) 实际上就是通过GCC 的内建函数 __builtin_expect() 进行编译优化: long __builtin_expect (long exp, long c) 该函数是告诉编译器:参…...
CSS -属性值的计算过程
目录 一、抛出两个问题1.如果我们学过优先级关系,那么请思考如下样式为何会生效2.如果我们学习过继承,那么可以知道color是可以被子元素继承使用的,那么请思考下述情景为何不生效 二、属性值计算过程1.确定声明值2.层叠冲突3.使用继承4.使用默…...
百度贴吧IP和ID是什么意思?怎么查看
在百度贴吧这一充满活力的网络社区中,IP和ID是两个频繁出现的概念。它们各自承载着不同的意义和作用,对于贴吧用户而言,了解这两个概念有助于更好地参与社区互动、保护个人隐私以及维护社区秩序。本文将详细解析百度贴吧中IP和ID的含义&#…...
SpiderX:专为前端JS加密绕过设计的自动化工具
SpiderX 一、工具概述 SpiderX是一款专为解决前端JS加密问题而设计的自动化绕过工具。在网络安全领域,随着前端加密技术的普及,传统的爬虫和自动化测试工具在面对复杂的JS加密时显得力不从心。SpiderX应运而生,旨在通过自动化手段高效绕过前…...
基于银河麒麟系统ARM架构安装达梦数据库并配置主从模式
达梦数据库简要概述 达梦数据库(DM Database)是一款由武汉达梦公司开发的关系型数据库管理系统,支持多种高可用性和数据同步方案。在主从模式(也称为 Master-Slave 或 Primary-Secondary 模式)中,主要通过…...
【AWS入门】AWS云计算简介
【AWS入门】AWS云计算简介 A Brief Introduction to AWS Cloud Computing By JacksonML 什么是云计算?云计算能干什么?我们如何利用云计算?云计算如何实现? 带着一系列问题,我将做一个普通布道者,引领广…...
适合企业内训的AI工具实操培训教程(37页PPT)(文末有下载方式)
详细资料请看本解读文章的最后内容。 资料解读:适合企业内训的 AI 工具实操培训教程 在当今数字化时代,人工智能(AI)技术迅速发展,深度融入到各个领域,AIGC(人工智能生成内容)更是成…...
【数据结构与算法】Java描述:第四节:二叉树
一、树的相关概念 编程中的树是模仿大自然中的树设计的,呈现倒立的结构,我们着重掌握 二叉树 。 1.1 基本概念: 结点的度:一个结点有几个子结点,度就是几; 如上图:A的度为3 树的度࿱…...
【一起来学kubernetes】14、StatefulSet使用详解
一、核心特性二、架构与组件三、生命周期管理四、典型应用场景**五、注意事项与最佳实践六、对比Deployment一、应用场景二、Pod管理三、部署与更新策略四、其他特性 七、常见问题八、拓展 前文中我们介绍了k8s中常用的一种控制器 Deployment,与之向对应的ÿ…...
Day5 结构体、文字显示与GDT/IDT初始化
文章目录 1. harib02b用例(使用结构体)2. harib02c用例3. harib02d用例(显示字符图案)3. harib02e用例(增加字符图案)4. harib02g用例4.1 显示字符串4.2 显示变量值 5. harib02h用例(显示鼠标&a…...
AI第一天 自我理解笔记--微调大模型
目录 1. 确定目标:明确任务和数据 2. 选择预训练模型 3. 数据预处理 (1) 数据清洗与格式化 (2) 划分数据集 (3) 数据加载与批处理 4. 构建微调模型架构 (1) 加载预训练模型 (2) 修改模型尾部(适配任务) (3) 冻结部分层(可…...
ClientAbortException问题分析
最近遇到一个问题,在设备采数据数据上报后频繁发生ClientAbortException异常,一种处理方案是ClientAbortException 问题分析-CSDN博客 一、ClientAbortException 的触发与影响 1. 定义与场景 ClientAbortException 是后端服务器(如 Tomc…...
系统思考全球化落地
感谢加密货币公司Bybit的再次邀请,为全球团队分享系统思考课程!虽然大家来自不同国家,线上学习的形式依然让大家充满热情与互动,思维的碰撞不断激发新的灵感。 尽管时间存在挑战,但我看到大家的讨论异常积极ÿ…...
