Java中Optional相关
Java中Optional相关
orElse
提供默认值以确保不会返回 null。
适用于默认情况下的备选值或简单计算结果。
// 如果 optionalName 为空,返回 "Unknown"
Optional<String> optionalName = Optional.empty();
String result = optionalName.orElse("Unknown");
System.out.println("Name: " + result); // 输出 Name: Unknown// 如果 optionalNumber 不为空,返回其值;否则返回默认值 0
Optional<Integer> optionalNumber = Optional.of(10);
int number = optionalNumber.orElse(0);
System.out.println("Number: " + number); // 输出 Number: 10
orElseGet
当生成默认值可能会带来额外开销时,可以使用 orElseGet 来提高性能。
允许生成复杂的默认值或者依赖于条件的值。
// 如果 optionalName 为空,通过 Supplier 生成默认值
Optional<String> optionalName = Optional.empty();
String result = optionalName.orElse("Name not provided");
System.out.println("Name: " + result); // 输出 Name: Name not provided// 如果 optionalScore 为空,通过 Supplier 生成默认值
Optional<Double> optionalScore = Optional.ofNullable(null);
double score = optionalScore.orElseGet(() -> Math.random() * 100);
System.out.println("Score: " + score); // 输出 Score: 随机生成的分数值
orElseThrow
当 Optional 为空时,抛出异常以确保程序不会继续执行下去。
用于强制要求 Optional 中必须包含值的场景。
// 如果 optionalName 为空,抛出 IllegalArgumentException 异常
Optional<String> optionalName = Optional.empty();
try {String result = optionalName.orElseThrow(() -> new IllegalArgumentException("Name not provided"));System.out.println("Name: " + result);
} catch (IllegalArgumentException e) {System.out.println(e.getMessage()); // 输出 Name not provided
}// 如果 optionalNumber 为空,抛出 NullPointerException 异常
Optional<Integer> optionalNumber = Optional.ofNullable(null);
try {int number = optionalNumber.orElseThrow(NullPointerException::new);System.out.println("Number: " + number);
} catch (NullPointerException e) {System.out.println("Caught exception: " + e.getMessage()); // 输出 Caught exception: null
}
isPresent
条件判断和流程控制: 可以根据 Optional 是否包含值来决定程序的执行路径。
避免空指针异常: 在对可能为 null 的值进行操作之前,先使用 isPresent() 来检查是否存在值,以避免空指针异常的发生。
默认值处理: 结合 isPresent() 和 orElse 或 orElseGet 方法,可以根据 Optional 是否包含值来决定返回默认值或进行其他处理。
// 检查 optionalName 是否包含值
Optional<String> optionalName = Optional.of("Alice");
if (optionalName.isPresent()) {System.out.println("Name is present: " + optionalName.get()); // 输出 Name is present: Alice
} else {System.out.println("Name not found");
}// 使用 isPresent() 来避免空指针异常
Optional<Integer> optionalNumber = Optional.empty();
if (optionalNumber.isPresent()) {int number = optionalNumber.get(); // 这里不会执行,因为 optionalNumber 为空System.out.println("Number: " + number);
} else {System.out.println("Number not found");
}// 结合 orElseGet 使用 isPresent() 来提供默认值
String defaultName = "Default";
Optional<String> optionalName2 = Optional.empty();
String result = optionalName2.isPresent() ? optionalName2.get() : defaultName;
System.out.println("Name: " + result); // 输出 Name: Default
map
值转换: 将 Optional 中的值进行转换或者计算。
链式调用: 可以与其他方法如 filter、flatMap 一起使用,实现复杂的值处理逻辑。
Optional<String> optionalName = Optional.of("Alice");// 将字符串转换为大写
Optional<String> upperCaseName = optionalName.map(name -> name.toUpperCase());
System.out.println("Upper case name: " + upperCaseName.get()); // 输出 Upper case name: ALICEOptional<Integer> optionalNumber = Optional.of(10);// 对数字进行加倍
Optional<Integer> doubledNumber = optionalNumber.map(num -> num * 2);
System.out.println("Doubled number: " + doubledNumber.get()); // 输出 Doubled number: 20Optional<String> optionalEmpty = Optional.empty();// 对空 Optional 进行映射
Optional<String> mappedEmpty = optionalEmpty.map(value -> value.toUpperCase());
System.out.println("Mapped empty: " + mappedEmpty.isPresent()); // 输出 Mapped empty: false
filter
条件过滤: 根据指定的条件过滤掉不符合要求的值。
优化流程: 在确定 Optional 包含有效值之前,可以使用 filter 进行必要的条件检查。
// 过滤出长度大于3的名字
Optional<String> optionalName = Optional.of("Bob");
Optional<String> filteredName = optionalName.filter(name -> name.length() > 3);
System.out.println("Filtered name: " + filteredName.isPresent()); // 输出 Filtered name: false// 过滤出大于10的数字
Optional<Integer> optionalNumber = Optional.of(15);
Optional<Integer> filteredNumber = optionalNumber.filter(num -> num > 10);
System.out.println("Filtered number: " + filteredNumber.get()); // 输出 Filtered number: 15// 对空 Optional 进行过滤
Optional<Integer> optionalEmpty = Optional.empty();
Optional<Integer> filteredEmpty = optionalEmpty.filter(value -> value > 0);
System.out.println("Filtered empty: " + filteredEmpty.isPresent()); // 输出 Filtered empty: false
or
备选方案: 在原始 Optional 为空时提供一个备选的 Optional 对象。
链式调用: 可以与 orElse, orElseGet 等方法结合使用,实现更复杂的值获取逻辑。
// 如果 optionalName 为空,则返回 backupName
Optional<String> optionalName = Optional.empty();
Optional<String> backupName = Optional.of("Backup Name");
Optional<String> result = optionalName.or(() -> backupName);
System.out.println("Result: " + result.get()); // 输出 Result: Backup Name// 如果 optionalNumber 不为空,则返回 optionalNumber;否则返回 backupNumber
Optional<Integer> optionalNumber = Optional.of(5);
Optional<Integer> backupNumber = Optional.empty();
Optional<Integer> resultNumber = optionalNumber.or(() -> backupNumber);
System.out.println("Result number: " + resultNumber.get()); // 输出 Result number: 5
get
获取值: 当确定 Optional 包含值时,直接获取该值。
注意事项: 使用 get 方法时,必须先通过 isPresent 或者其他条件确保 Optional 包含值,避免抛出异常。
Optional<String> optionalName = Optional.of("Alice");// 直接获取 Optional 中的值
String name = optionalName.get();
System.out.println("Name: " + name); // 输出 Name: AliceOptional<String> optionalEmpty = Optional.empty();// 尝试从空的 Optional 中获取值,会抛出 NoSuchElementException 异常
// String emptyName = optionalEmpty.get();
// System.out.println("Empty Name: " + emptyName); // 抛出 NoSuchElementException
orElseThrow
处理空值情况: 提供一个异常供给型函数,在 Optional 为空时抛出指定异常。
自定义异常信息: 可以通过自定义的异常类型和消息来更好地描述空值情况。
Optional<String> optionalName = Optional.empty();// 如果 optionalName 为空,则抛出自定义的异常
String name = optionalName.orElseThrow(() -> new IllegalStateException("Name is not present"));
// 输出异常信息:Exception in thread "main" java.lang.IllegalStateException: Name is not present
isEmpty
判断空值: 更直观地判断 Optional 是否为空。
条件逻辑: 可以与其他方法结合使用,优化条件判断逻辑。
Optional<String> optionalName = Optional.of("Bob");
Optional<String> optionalEmpty = Optional.empty();// 检查 optionalName 是否为空
boolean namePresent = !optionalName.isEmpty();
System.out.println("Name present: " + namePresent); // 输出 Name present: true// 检查 optionalEmpty 是否为空
boolean emptyPresent = !optionalEmpty.isEmpty();
System.out.println("Empty present: " + emptyPresent); // 输出 Empty present: false
of
非空值的创建: 当确定值不为 null 时,可以使用 of 创建对应的 Optional 对象。
避免空指针异常: 在确定值不为 null 的情况下,使用 of 可以直接创建 Optional 对象,避免后续空指针异常。
String name = "Alice";// 创建包含非 null 值的 Optional 对象
Optional<String> optionalName = Optional.of(name);
System.out.println("Name: " + optionalName.get()); // 输出 Name: AliceString nullName = null;// 尝试使用 null 创建 Optional 对象,会抛出 NullPointerException
// Optional<String> optionalNull = Optional.of(nullName);
// System.out.println("Null Name: " + optionalNull.get()); // 抛出 NullPointerException
ofNullable
可能为空的值的创建: 当值可能为 null 时,可以使用 ofNullable 创建对应的 Optional 对象。
安全地处理可能为 null 的情况: 可以避免直接操作可能为 null 的值,提高代码的健壮性。
String name = "Bob";
String nullName = null;// 创建包含非 null 值的 Optional 对象
Optional<String> optionalName = Optional.ofNullable(name);
System.out.println("Name: " + optionalName.orElse("Default Name")); // 输出 Name: Bob// 创建可能为空的 Optional 对象
Optional<String> optionalNull = Optional.ofNullable(nullName);
System.out.println("Null Name: " + optionalNull.orElse("Default Name")); // 输出 Null Name: Default Name
isPresent
表示缺失值: 可以用于明确指示某个值不存在的情况。
结合其他方法使用: 可以与 orElse, orElseGet, orElseThrow 等方法结合使用,提供默认值或者处理逻辑。
Optional<String> emptyOptional = Optional.empty();// 使用 empty 创建的 Optional 对象没有值
System.out.println("Empty Optional: " + emptyOptional.isPresent()); // 输出 Empty Optional: false
flatMap
扁平化映射: 用于处理嵌套的 Optional 结构,将嵌套的 Optional 展开为单层结构。
链式调用: 可以与 map 结合使用,进行复杂的值转换和处理。
Optional<String> optionalName = Optional.of("Alice");
Optional<String> optionalEmpty = Optional.empty();// 使用 flatMap 将 Optional<String> 转换为 Optional<Integer>
Optional<Integer> nameLengthOptional = optionalName.flatMap(name -> Optional.of(name.length()));
System.out.println("Name length: " + nameLengthOptional.get()); // 输出 Name length: 5// 如果 Optional 是空的,则 flatMap 不执行映射
Optional<Integer> emptyLengthOptional = optionalEmpty.flatMap(value -> Optional.of(value.length()));
System.out.println("Empty length: " + emptyLengthOptional.isPresent()); // 输出 Empty length: false
相关文章:
Java中Optional相关
Java中Optional相关 orElse 提供默认值以确保不会返回 null。 适用于默认情况下的备选值或简单计算结果。 // 如果 optionalName 为空,返回 "Unknown" Optional<String> optionalName Optional.empty(); String result optionalName.orElse(&q…...
AI在HR候选人关系管理中的革新应用
一、引言 随着人工智能(AI)技术的快速发展,其在人力资源管理(HR)领域的应用也日益广泛。特别是在候选人关系管理方面,AI技术不仅提高了管理效率,还使得候选人体验得到了极大的改善。本文将深入分…...
HTML+CSS+JavaScript制作七夕表白网页(含音乐+自定义文字+烟花特效)
利用HTMLCSSJavaScript制作了一个简单的七夕表白网页: 这是一个简单的表白功能,可以用于小哥哥小姐姐在情人节向心爱的人表白使用点击信封中间的爱心,会出现一封信由信封向外展开,与此同时会有烟花绽放,并且自动播放背…...
【Python机器学习系列】一文教你实现决策树模型可视化(案例+源码)
这是我的第335篇原创文章。 一、引言 决策树是一个有监督分类模型,本质是选择一个最大信息增益的特征值进行输的分割,直到达到结束条件或叶子节点纯度达到阈值。根据分割指标和分割方法,可分为:ID3、C4.5、CART算法。每一种颜色代…...
如何在Python中使用网页抓取API获得Google搜索结果
SERP是搜索引擎结果页的缩写,它是你在百度、谷歌、Bing等搜索引擎中提交查询后所得到的页面。搜索引擎需要给所有页面做排序,把最能解决我们需求的页面展示给我们,企业会非常关注结果页的排序,也就是本企业内容的自然排名情况。手…...
Postman高频面试题及答案汇总(接口测试必备)
Postman在软件测试的面试中,可以说是必考题了,既然是高频考题,当然得为粉丝宝宝们整理一波题库喽~ 一、Postman在工作中使用流程是什么样的? 二、你使用过Postman的哪些功能? 三、Postman如何管理测试环境ÿ…...
JavaEE 初阶(13)——多线程11之“定时器”
目录 一. 什么是“定时器” 二. 标准库的定时器 三. 定时器的实现 MyTimer 3.1 分析思路 1. 创建执行任务的类。 2. 管理任务 3. 执行任务 3.2 线程安全问题 四. 拓展 一. 什么是“定时器” 定时器是软件开发中的一个重要组件,类似于一个“闹钟”࿰…...
2024最新全开源付费进群系统源码二开修复版 支持易支付
内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 全开源付费进群系统源码,开源无加密无授权,优化电脑端访问布局,支持dai理,对接易支付通道,dai理可以配置自己易支付接口&am…...
【奥顺苹果CMS二开泛目录4.X版】PHP站群程序新增首页堆砌关键词新增四套seo模板
演示站(赠送四套模板): https://macfan.qdwantong.com https://macfan2.qdwantong.com https://macfan3.qdwantong.com https://macfan4.qdwantong.com 4.X版程序特色功能: 后台除了可以设置干扰码、转码、插入符号和拼音这…...
day06 项目实践:router,axios
vue组件的生命周期钩子 今天几乎没有讲什么新内容,就是一起做项目,只有一个小小的知识点,就是关于vue组件的生命周期钩子,其中最重要的四个函数—— beforeCreate():组件创建之间执行 created():组件创建…...
⌈ 传知代码 ⌋ 基于矩阵乘积态的生成模型
💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…...
软件测试必备技能
在软件测试领域,以下是一些必备的技能和能力,可以帮助你成为一名优秀的软件测试工程师: 1. 测试基础知识: 熟悉软件测试的基本概念、原则和流程,包括不同类型的测试(如单元测试、集成测试、系统测试&#…...
TL3568编译uboot报错
编译uboot前,需要 ① sudo apt-get install device-tree-compiler 否则会报“ERROR: No dtc” ② sudo apt install python 装个Python2,否则会报“ERROR: No python2”...
qiankun 微前端 隔离子应用样式,解决 ant-design-vue 子应用样式污染问题(已落地)
样式冲突产生原因 先分析乾坤qiankun 构建之后,会根据你的配置 给每个子应用生成一个id, 当加载到对应子应用的时候,就把内容放到对应的id 标签里去, 这样能有效的隔离 js 代码,但是样式是加载在全局的 所以 当两个子…...
一个前后端分离架构的低代码开发平台,支持微服务架构,支持开发SAAS项目(附源码)
前言 在当前的企业软件开发领域,开发者常常面临着代码重复性高、开发效率低、项目周期长等挑战。现有的软件解-决方案往往难以满足快速变化的市场需求,特别是在SAAS项目、企业信息管理系统(MIS)、内部办公系统(OA&…...
whisper+whisperx ASR加对齐
忘了怎么安装了,这里记录一下整理出来的类,不过这个 from chj.comm.pic import *import json import whisper import whisperx import gcclass Warp_whisper:def __init__(self, language"zh", device"cuda", compute_type"fl…...
【已解决】YOLOv8加载模型报错:super().__init__(torch._C.PyTorchFileReader(name_or_buffer))
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...
中国象棋 纯网页前端 演示与下载
https://andi.cn/app/chess/...
学习大数据DAY29 python基础语法2
目录 调试---debug tuple(元组) set(集合) dict(字典) 转换 推导式 上机练习 3 函数 参数 不定长参数 值传递与引用传递 局部和全局变量 上机练习 4 调试---debug 1. 先设置断点 2. 点击调试…...
自动化测试常用函数(Java方向)
目录 一、元素的定位 1.1 cssSelector 1.2 xpath 1.2.1 获取HTML页面所有的节点 1.2.2 获取HTML页面指定的节点 1.2.3 获取⼀个节点中的直接子节点 1.2.4 获取⼀个节点的父节点 1.2.5 实现节点属性的匹配 1.2.6 使用指定索引的方式获取对应的节点内容 二、操作测试对…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
