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 使用指定索引的方式获取对应的节点内容 二、操作测试对…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
