Optional 类
概述
到目前为止,臭名昭著的空指针异常是导致 Java 应用程序失败的最常见原因。以前,为了解决空指针异常,Google 公司著名的 Guava 项目引入了 Optional 类, Guava 通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到 Google Guava 的启发,Optional 类已经成为 Java 8 类库的一部分。
Optional<T> 类(java.util.Optional)是一个容器类,它可以保存类型 T 的值,代表这个值存在。或者仅仅保存 null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
Optional 类的 Javadoc 描述如下:这是一个可以为 null 的容器对象。如果值存在则 isPresent() 方法会返回 true,调用 get() 方法会返回该对象。
Optional 提供很多有用的方法,这样我们就不用显式进行空值检测。
我们先来看一段代码:
public static String getGender(Student student){if(null == student) {return "Unkown";}return student.getGender();
}
这是一个获取学生性别的方法,方法入参为一个 Student 对象,为了防止 student 对象为 null, 做了防御性检查:如果值为 null,返回 “Unkown”。
再看使用 Optional 优化后的方法:
public static String getGender(Student student) {return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown");
}
可以看到,Optional 类结合 lambda 表达式 的使用能够让开发出的代码更简洁和优雅。
创建 Optional 类对象的方法
我们看下 Optional 类的部分源码:
private static final Optional<?> EMPTY = new Optional<>();private final T value;private Optional() {this.value = null;
}public static<T> Optional<T> empty() {@SuppressWarnings("unchecked")Optional<T> t = (Optional<T>) EMPTY;return t;
}private Optional(T value) {this.value = Objects.requireNonNull(value);
}public static <T> Optional<T> of(T value) {return new Optional<>(value);
}public static <T> Optional<T> ofNullable(T value) {return value == null ? empty() : of(value);
}
Optional.of(T t):创建一个 Optional 实例,t 必须非空。Optional.empty():创建一个空的 Optional 实例。Optional.ofNullable(T t):t 可以为 null。
判断 Optional 容器中是否包含对象
-
boolean isPresent():判断是否包含对象。 -
void ifPresent(Consumer<? super T> consumer):如果有值,就执行Consumer接口的实现代码,并且该值会作为参数传给它。部分源码: -
public void ifPresent(Consumer<? super T> consumer) {if (value != null)consumer.accept(value); } -
示例:
public static void printName(Student student) {Optional.ofNullable(student).ifPresent(u -> System.out.println("The student name is : " + u.getName())); } -
上述示例用于打印学生姓名,由于
ifPresent()方法内部做了null值检查,调用前无需担心NPE(NullPointerException)问题。
获取 Optional 容器的对象
-
T get():如果调用对象包含值,返回该值,否则抛异常。 -
T orElse(T other):如果有值则将其返回,否则返回指定的 other 对象。部分源码: -
public T orElse(T other) {return value != null ? value : other; } -
示例:
public static String getGender(Student student) {return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown"); } -
T orElseGet(Supplier<? extends T> other):如果有值则将其返回,否则返回由 Supplier 接口实现提供的对象。部分源码: -
public T orElseGet(Supplier<? extends T> other) {return value != null ? value : other.get(); } -
示例:
public static String getGender(Student student) {return Optional.ofNullable(student).map(u -> u.getGender()).orElseGet(() -> "Unkown"); } -
T orElseThrow(Supplier<? extends X> exceptionSupplier):如果有值则将其返回,否则抛出由 Supplier 接口实现提供的异常。示例:
public static String getGender1(Student student) {return Optional.ofNullable(student).map(u -> u.getGender()).orElseThrow(() -> new RuntimeException("Unkown")); }
相关文章:
Optional 类
概述 到目前为止,臭名昭著的空指针异常是导致 Java 应用程序失败的最常见原因。以前,为了解决空指针异常,Google 公司著名的 Guava 项目引入了 Optional 类, Guava 通过使用检查空值的方式来防止代码污染,它鼓励程序员…...
自动微分技术在 AI for science 中的应用
本文简记我在学习自动微分相关技术时遇到的知识点。 反向传播和自动微分 以 NN 为代表的深度学习技术展现出了强大的参数拟合能力,人们通过堆叠固定的 layer 就能轻松设计出满足要求的参数拟合器。 例如,大部分图神经网络均基于消息传递的架构。在推理…...
ASM OMF single-file creation form 重命名
OMF下不能自动命名,需要重新命名的话:1 1. spfile 可以 create pfile from spfile 后再create spfile from pfile 2 redo? 3 datafile? Here are some details of the copy problem: a) You are not allowed to set the numbe…...
VGGNet
VGGNet CNN卷积网络的发展史 1. LetNet5(1998) 2. AlexNet(2012) 3. ZFNet(2013) 4. VGGNet(2014) 5. GoogLeNet(2014) 6. ResNet(2015) 7. DenseNet(2017) 8. EfficientNet(2019) 9. Vision Transformers(2020) 10. 自适应卷积网络(2021) 上面列出了发展到现在CNN的一些经典…...
SpringMVC:转发和重定向
1. 请求转发和重定向简介 参考该链接第9点 2. forward 返回下一个资源路径,请求转发固定格式:return "forward:资源路径"如 return "forward:/b" 此时为一次请求返回逻辑视图名称 返回逻辑视图不指定方式时都会默认使用请求转发in…...
961操作系统知识总结
部分图片可能无法显示,参考这里:https://zhuanlan.zhihu.com/p/701247894 961操作系统知识总结 一 操作系统概述 1. 操作系统的基本概念 重要操作系统类型:批处理操作系统(批量处理作业,单道批处理/多道批处理系统,用…...
电脑死机问题排查
情况描述:2024年6月2日下午16:04分电脑突然花屏死机,此情况之前遇到过三次,认为是腾讯会议录屏和系统自带录屏软件冲突导致。 报错信息:应用程序-特定 权限设置并未向在应用程序容器 不可用 SID (不可用)中运行的地址…...
百度地图1
地图的基本操作 百度地图3.0文档 百度地图3.0实例中心 设置地图 centerAndZoom(center: Point, zoom: Number)设初始化地图,center类型为Point时,zoom必须赋值,范围3-19级, // 百度地图API功能var map new BMap.Map("map"); //…...
Ubuntu 24.04 LTS 安装Docker
1 更新软件包索引: sudo apt-get update 2 安装必要的软件包,以允许apt通过HTTPS使用仓库: sudo apt-get install apt-transport-https ca-certificates curl software-properties-common 3 添加Docker的官方GPG密钥: curl -fs…...
【架构设计】Java如何利用AOP实现幂等操作,防止客户端重复操作
1实现方案详解 在Java中,使用AOP(面向切面编程)来实现幂等操作是一个常见的做法,特别是当你想在不修改业务代码的情况下添加一些横切关注点(如日志、事务管理、安全性等)时。幂等操作指的是无论执行多少次,结果都是相同的操作。 为了利用AOP实现幂等操作以防止客户端重…...
笔记:美团的测试
0.先启动appium 1.编写代码 如下: from appium import webdriver from appium.webdriver.extensions.android.nativekey import AndroidKeydesired_caps {platformName: Android,platformVersion: 10,deviceName: :VOG_AL10,appPackage: com.sankuai.meituan,ap…...
【30天精通Prometheus:一站式监控实战指南】第15天:ipmi_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
亲爱的读者们👋 欢迎加入【30天精通Prometheus】专栏!📚 在这里,我们将探索Prometheus的强大功能,并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。🚀 Prometheus是云原生和DevOps的…...
STM32F103借助ESP8266连接网络
ESP8266配置 STM32F103本身是不具备联网功能的,所以我们必须借助其他单片机来进行联网,然后让STM32与联网单片机通信,就可以实现STM32联网了。 本文借助的是ESP8266模块,其通过UART协议与STM32通信(http://t.csdnimg.c…...
Feature Manipulation for DDPM based Change Detection
基于去噪扩散模型的特征操作变化检测 文章提出了一种基于去噪扩散概率模型(DDPM)的特征操作变化检测方法。变化检测是计算机视觉中的经典任务,涉及分析不同时间捕获的图像对,以识别场景中的重要变化。现有基于扩散模型的方法主要…...
第十三届蓝桥杯国赛大学B组填空题(c++)
A.2022 动态规划 AC; #include<iostream> #define int long long using namespace std; int dp[2050][15]; //dp[i][j]:把数字i分解为j个不同的数的方法数 signed main(){dp[0][0]1;for(int i1;i<2022;i){for(int j1;j<10;j){//一种是已经分成j个数,这时只需每一个…...
conda源不能用了的问题
conda旧没用了,不知道什么原因,安装源出问题,报如下错: Loading channels: failedUnavailableInvalidChannel: HTTP 404 NOT FOUND for channel anaconda/pkgs/main <https://mirrors.aliyun.com/anaconda/pkgs/main>The c…...
【C#】自定义List排序规则的两种方式
目录 1.系统排序原理 2.方式一:调用接口并重写 3.方式二:传排序规则函数做参数 1.系统排序原理 当我们对一个List<int>类型的数组如list1排序时,一个轻松的list1.sort();帮我们解决了问题 但是在实际应用过程中,往往我们…...
ANAH数据集- 大模型幻觉细粒度评估工具
大型语言模型(LLMs)在各种自然语言处理任务中取得了显著的性能提升。然而,它们在回答用户问题时仍面临一个令人担忧的问题,即幻觉,它们会产生听起来合理但不符合事实或无意义的信息,尤其是当问题需要大量知…...
AI前沿技术探索:智能化浪潮下的创新与应用
一、引言 随着科技的不断进步,人工智能(AI)已成为推动社会发展的重要力量。从自动驾驶汽车到智能医疗诊断,从智能家居到虚拟助手,AI技术正逐渐渗透到我们生活的方方面面。本文旨在探讨AI的前沿技术、创新应用以及未来…...
JVM类加载过程
在Java虚拟机规范中,把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java.lang.Class对象,这个过程被称作类加载过程。一个类在整个虚拟机周期内会经历如下图的阶段&…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
