在Java中正确使用Optional

news2025/1/13 9:48:36

在这里插入图片描述

Optional类是在Java 8中引入的,用于解决NullPointerException的问题。

java.util.Optional类是一个泛型类型的类,只包含一个类型为T的值。其目的是提供对可能为null的类型T的引用对象的更安全的替代方案。但是,只有在正确使用的情况下,Optional对象才是安全的。

创建Optional对象的方式:

Empty Optional
使用Optional.empty(),我们可以创建一个不包含任何类型的空的optional对象。

//returning a empty optional of type string
public static Optional<String> emptyOptional(){
       return Optional.empty();
}

//or
Optional<String> str = Optional.empty();

Nullable Optional
使用Optional.ofNullable()方法,我们可以创建可空的Optional对象。这些对象可以是null,也可以包含值。

public static Optional<Wallet> getWallet(){
        return Optional.ofNullable(null);
}

Non-Nullable Optional
使用该Optional.of()方法我们可以创建不可为 null 的可选对象。

public static Optional<Wallet> getWallet(){
        return Optional.of(new Wallet(100));
}

现在让我们看一下Optional类中的不同方法,我们可以利用这些方法来编写促进空安全的清晰代码。

在Optional类中的 get() 方法用于获取值,如果存在的话,否则抛出NoSuchElementException异常。

例如,假设我们有一个具有私有字段money的Wallet对象。要获取money的值,我们可以按如下方式操作:

//normal way to get money 
int savings = wallet.getMoney();

//when wallet object is wrapped in a optional 
int savings = optionalWallet.get().getMoney();

如果wallet对象为null,第二种方式比第一种方式更安全,因为它会抛出NoSuchElementException而不是NullPointerException。

我们可以通过使用isPresent()方法来改进第二种方式,该方法返回一个布尔值,指示值是否存在。

List<Integer> savings = new ArrayList();
if(optionalWallet.isPresent()){
    savings.add(optionalWallet.get().getMoney());
}

但与此同时,这种方式并没有比检查非空更为简洁。

List<Integer> savings = new ArrayList();
if(wallet != null){
  savings .add(wallet.getMoney());
} 

为了使代码更简洁清晰,我们可以使用ifPresent()方法,该方法接受一个Consumer或一个Runnable,或者两者都接受。使用ifPresent(),我们可以消耗一个正确的值或生成一个替代值。让我们看一下具体的用法。

List<Integer> savings = new ArrayList();
optionalWallet.ifPresent(wallet -> savings.add(wallet.getMoney()));

在上面的示例中,只有当wallet不为null时,即存在时,才将money添加到savings中。

如果我们将wallet本身添加到列表中。

//using lambda
List<Wallet> wallets  = new ArrayList<>();
optionalWallet.ifPresent(wallet -> wallets.add(wallet));

//you can also use method reference
List<Wallet> wallets  = new ArrayList<>();
optionalWallet.ifPresent(wallets::add);

正如你所看到的,这比一开始的示例要好得多。

在某些情况下,当optional为空时,你可能希望有一个默认值。使用orElse()方法,我们可以在optional为null时生成一个替代值。让我们看一个例子。

List<Wallet> wallets  = new ArrayList<>();
Wallet wallet = optionalWallet.orElse(new Wallet(0));
wallets.add(wallet);

在上面的例子中,如果optionalWallet包含一个值,它将被赋给wallet变量;如果没有值,则分配一个值为0的默认wallet。orElse()方法可以与任何其他类型一起使用,生成默认值。

你还可以在orElseGet()方法内调用一块代码来计算一个默认值。

//calculating a default value 
Wallet wallet = optionalWallet.orElseGet(() -> {
            int randomAmount = (int) (Math.random() * 500); // Generating a random amount between 0 and 500
            return new Wallet(randomAmount);
});

在使用Spring Boot应用程序和数据库时,当我们执行选择查询以获取用户时,一种良好的实践是将用户对象封装在Optional中,然后我们可以这样做:

//Getting the user from database
Optional<User> findUserById(String id);

//Calling the find user method 
User user = findUserById(id)
                    .orElseThrow(UserNotFoundException::new);

在上面的例子中,你可以看到,我们不需要进行任何检查来确定用户是否存在。如果数据库中存在用户,我们将获取该用户;如果不存在,我们将在那里优雅地抛出一个异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1376311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Discourse 访问统计数据的不一致

Discourse 如果使用网站跟踪程序&#xff0c;例如 Google Analytics 得到的网站访问数据和真实的网站访问数据是不一致的。 通常 Google Analytics 提供的数据更少&#xff0c;或者说是少很多。 这是因为 Discourse 的数据调用使用的是 API&#xff0c;在你的页面载入后&…

Java医院综合绩效考核系统源代码

医院绩效考核管理系统是采用B/S架构模式设计、使用JAVA语言开发、后台使用MySql数据库进行管理的一整套计算机应用软件。系统和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和医生、护士、其他人员工作量&#xff0c;对没有录入信息化系统的工作…

【C语言小游戏】贪吃蛇

文章目录 1.引言2.运行图2.涉及知识3 Windows API3.1 控制台3.2 控制台屏幕坐标3.3 操作句柄3.4 控制台屏幕光标3.5 监视按键 4. 设计说明5. 完整代码 1.引言 使⽤C语⾔在Windows环境的控制台中模拟实现经典⼩游戏贪吃蛇 实现基本的功能&#xff1a; 贪吃蛇地图绘制蛇吃⻝物的…

《BackTrader量化交易图解》第9章:回测结果分析

文章目录 9. 回测结果分析9.1 常用量化分析指标9.2 Analyzer 分析类9.3 Analyzer 分析模块架构图9.4 SQN 指数9.5 案例&#xff1a;回测数据基本分析9.6 案例&#xff1a;回测数据扩展指标分析 9. 回测结果分析 9.1 常用量化分析指标 使用BackTrader等量化软件做交易会生成大…

js(JavaScript)数据结构之字典

什么是数据结构&#xff1f; 下面是维基百科的解释&#xff1a; 数据结构是计算机存储、组织数据的方式。数据结构意味着接口或封装&#xff1a;一个数据结构可被视为两个函数之间的接口&#xff0c;或者是由数据类型联合组成的存储内容的访问方法封装。 我们每天的编码中都会…

审稿变慢?还疯狂拒稿?这本毕业神刊如今争议不断,还值得一投吗?

【SciencePub学术】 IEEE ACCESS 期刊评说 网友辣评 评说1&#xff1a;麻了&#xff0c;11月17收到外审&#xff0c;现在意见还没回来啊&#xff0c;神刊肿么了&#xff1f; 评说2&#xff1a;两个审稿人评审的&#xff0c;一个拒绝&#xff08;最终意见大修&#xff09;&…

代码随想录 Leetcode707. 设计链表

题目&#xff1a; 代码(首刷看解析 2024年1月11日&#xff09;&#xff1a; class MyLinkedList { private:struct ListNode{int val;ListNode* next;ListNode(int val):val(val),next(nullptr){}};int size;ListNode* dummyHead; public:MyLinkedList() {dummyHead new List…

序章 初始篇—转生到vue世界!

Vue.js 是什么&#xff1f; Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项…

四、C++运算符(4)比较运算符

作用&#xff1a;用于表达式的比较&#xff0c;并返回一个真值或者假值 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> using namespace std; int main() {//int a 10;int b 20; //变量a重新赋值为100//cout << (ab) << end…

【Redis】Redis 进阶

文章目录 1. BigKey1.1 MoreKey1.2 BigKey 2. 缓存双写一致性更新策略2.1 读缓存数据2.2 数据库和缓存一致性的更新策略2.3 canal 实现双写一致性 3. 进阶应用3.1 统计应用3.2 hyperloglog3.3 GEO3.4 bitmap 4. 布隆过滤器5. Redis 经典问题5.1 缓存预热5.2 缓存穿透5.3 缓存击…

order by 与 分页 的冲突

order by 与 分页 的冲突 问题背景 Oracle拼接SQL&#xff0c;JAVA使用SQLQueryExecutor执行拼接的SQL&#xff0c;SQL如下&#xff1a; SELECT col_key, col_other_info FROM tb_tableName WHERE col_where_info 一些筛选条件 order by col_updatetime desc 该表中的数…

一行代码给Button添加一个光标焦点动画:得着焦点按钮放大,失去焦点按钮恢复

当光标进入Button的时候&#xff0c;也就是Button得着焦点时&#xff0c;Button出现放大效果&#xff0c;失去焦点的时候&#xff0c;恢复原来的尺寸。 本例仅供学习交流之用 一、效果 按钮得着焦点&#xff0c;放大 按钮失去焦点&#xff0c;恢复 二、给按钮添加动效 得着…

k8s中的基础概念

k8s可以从硬件和软件两方面来理解&#xff1a; 硬件&#xff1a; 1、节点&#xff08;Node&#xff09;&#xff1a;类似于手机、平板、电脑 2、集群&#xff08;Cluster&#xff09;&#xff1a;多个节点组合到一起 3、持久卷&#xff08;Persistent Volumes&#xff09;&…

微信小程序开发WebSocket通讯

官方文档说明&#xff1a;入口 WebSocket连接的链接只支持wss加密方式&#xff0c;且只能用域名的方式 该域名还要在微信公众平台的小程序中登记才能使用&#xff0c;开发->开发管理->服务器域名->修改 该域名要和https使用的一致 以域名地址&#xff1a;dtu.aab…

质量好洗地机有哪些?洗地机口碑榜

在很多人眼中&#xff0c;洗地机可能被简单地视为一种高价的拖把&#xff0c;但作为一个经验丰富的洗地机测评博主&#xff0c;我要强调洗地机在家务工作中的巨大价值。它不仅仅是一种清洁工具&#xff0c;更是集扫地、拖地、洗地以及擦干地板等多项功能于一身的强大设备。通过…

【软件测试】学习笔记-设计GUI自动化测试策略

这篇文章从“实战”这个角度展开&#xff0c;探讨实际的大型全球化电商网站的GUI自动化测试如何开展。这场实战&#xff0c;从以下两个方面展开&#xff1a; 测试策略如何设计&#xff1f;这一点&#xff0c;我会根据亲身经历的实际项目&#xff0c;和你探讨GUI测试的分层测试…

R730服务器做了raid的硬盘,插在R720上面可以用吗?

环境 戴尔R720 戴尔R730 问题描述 R730服务器做了raid的硬盘&#xff0c;插在R720上面可以用吗&#xff1f; 解决方案 1.直接在 R730服务器做了raid的硬盘&#xff0c;卸下来在插在r720上面使用 &#xff0c;读不到硬盘 2.前往R730服务器上面&#xff0c;去清除RAID配置的…

采集小红书笔记详情页的方法,大部分人都想得复杂了

一般来说&#xff0c;社交媒体都有列表页和详情页、个人主页三大页面&#xff0c;列表页一般包含搜索结果页、话题聚合页等等&#xff0c;详情页就是点开某一条笔记或者动态的具体页面&#xff1b; 小红书当然也不例外&#xff0c;比如下面这个话题聚合页&#xff1a; https:/…

csv文件查找工具(一)

自己写的小工具&#xff0c;查询csv文件前三列的数据互查&#xff0c; 主要目的是 组sql 需要这三个数据互查&#xff0c; 当然从数据库查的更快&#xff0c; 但数据库的连接需要验证权限&#xff0c;能自己搞&#xff0c;先自己搞 速度待优化&#xff0c;没时间搞了&#xff0…

【办公技巧】Word功能区灰色显示不能编辑,怎么破?

Word文档可以设置加密来保护文件禁止修改&#xff0c;但是在word文档中设置限制编辑功能时对它的作用是否有详细的了解呢&#xff1f;今天为大家介绍word限制编辑功能的作用以及忘记了限制编辑密码该如何解决。 设置限制大家应该都清楚&#xff0c;就是点击工具栏中的审阅 – …