Java8之Optional类的基本使用
文章目录
- 一、简介
- 二、常见的Optional用法:
- 1、创建Optional对象:
- 1.1 使用of()方法:
- 1.2 使用ofNullable()方法:
- 1.3 使用empty()方法:
- 2、判断Optional是否包含值:
- 2.1 使用isPresent()方法:
- 3、获取Optional中的值:
- 3.1 使用get()方法:
- 3.2 使用orElse()方法:
- 3.3 使用orElseGet()方法:
- 3.4 使用orElseThrow()方法:
- 4、转换Optional中的值:
- 4.1 使用map()方法:
- 4.2 使用flatMap()方法:
一、简介
- Optional是一个容器对象,它可能包含某个值,也可能不包含。
- 它的设计目的是为了解决空指针异常问题。
- 使用Optional可以避免在代码中显式地检查null值,从而使代码更加简洁和可读。
二、常见的Optional用法:
1、创建Optional对象:
1.1 使用of()方法:
创建一个包含指定非null值的Optional对象。
下面是一个使用of()方法创建Optional对象的示例:
import java.util.Optional;public class OptionalDemo {public static void main(String[] args) {String value = "Hello World!";Optional<String> optional = Optional.of(value);// 检查Optional是否包含值if (optional.isPresent()) {System.out.println("Optional包含值: " + optional.get());} else {System.out.println("Optional为空");}}
}
在这个示例中,我们使用of()方法创建了一个包含非null值的Optional对象。然后我们通过调用isPresent()方法检查Optional是否包含值。如果Optional包含值,则调用get()方法获取该值并打印输出;否则打印输出Optional为空。
输出结果为:
Optional包含值: Hello World!
注意:使用of()方法时,如果传入的值为null,会立即抛出NullPointerException异常。因此,在使用of()方法创建Optional对象时,需要确保传入的值不为空。如果值可能为空,可以使用ofNullable()方法创建Optional对象,该方法可以接受null值。
1.2 使用ofNullable()方法:
创建一个包含指定值的Optional对象,如果值为null,则创建一个空的Optional对象。
下面是一个使用ofNullable()方法创建Optional对象的示例:
import java.util.Optional;public class OptionalDemo {public static void main(String[] args) {String value = null;Optional<String> optional = Optional.ofNullable(value);// 检查Optional是否包含值if (optional.isPresent()) {System.out.println("Optional包含值: " + optional.get());} else {System.out.println("Optional为空");}}
}
在这个示例中,我们使用ofNullable()方法创建了一个包含指定值的Optional对象。如果值为null,则创建一个空的Optional对象。然后我们通过调用isPresent()方法检查Optional是否包含值。如果Optional包含值,则调用get()方法获取该值并打印输出;否则打印输出Optional为空。
输出结果为:
Optional为空
注意:使用ofNullable()方法创建的Optional对象可以接受null值,不会立即抛出NullPointerException异常。这样可以更灵活地处理可能为空的值。
1.3 使用empty()方法:
创建一个空的Optional对象。
下面是一个使用empty()方法创建空的Optional对象的示例:
import java.util.Optional;public class OptionalDemo {public static void main(String[] args) {Optional<String> optional = Optional.empty();// 检查Optional是否包含值if (optional.isPresent()) {System.out.println("Optional包含值: " + optional.get());} else {System.out.println("Optional为空");}}
}
在这个示例中,我们使用empty()方法创建了一个空的Optional对象。然后我们通过调用isPresent()方法检查Optional是否包含值。由于我们使用empty()方法创建的Optional对象是空的,所以isPresent()返回值为false,程序会打印输出Optional为空。
输出结果为:
Optional为空
使用empty()方法创建的Optional对象始终是空的,不包含任何值。这在某些情况下可以用于表示缺失值。
2、判断Optional是否包含值:
2.1 使用isPresent()方法:
如果Optional对象包含值,则返回true,否则返回false。
3、获取Optional中的值:
3.1 使用get()方法:
如果Optional对象包含值,则返回该值,否则抛出NoSuchElementException异常。
下面是一个示例代码:
import java.util.Optional;public class OptionalDemo {public static void main(String[] args) {Optional<String> optional = Optional.of("Hello World");try {String value = optional.get();System.out.println("Optional的值: " + value);} catch (NoSuchElementException e) {System.out.println("Optional为空");}}
}
在这个示例中,我们使用of()方法创建一个非空的Optional对象,并将字符串"Hello World"作为值传递给它。然后,我们使用get()方法获取Optional对象的值,并进行相应的操作。
输出结果为:
Optional的值: Hello World
如果我们将Optional对象设为空:
Optional<String> optional = Optional.empty();
则optional.get()会抛出NoSuchElementException异常,因为Optional对象为空。
请注意,使用get()方法时,一定要先使用isPresent()方法来检查Optional对象是否包含值,以避免抛出异常。
3.2 使用orElse()方法:
如果Optional对象包含值,则返回该值,否则返回指定的默认值。
以下是一个示例代码:
import java.util.Optional;public class OptionalDemo {public static void main(String[] args) {Optional<String> optional = Optional.of("Hello World");String value = optional.orElse("Default Value");System.out.println("Optional的值: " + value);}
}
在这个示例中,我们使用of()方法创建一个非空的Optional对象,并将字符串"Hello World"作为值传递给它。然后,我们使用orElse()方法获取Optional对象的值,如果Optional对象为空,则返回指定的默认值"Default Value"。
输出结果为:
Optional的值: Hello World
如果我们将Optional对象设为空:
Optional<String> optional = Optional.empty();
则optional.orElse(“Default Value”)会返回指定的默认值"Default Value",因为Optional对象为空。
使用orElse()方法时,可以避免抛出异常,并且可以提供一个默认值来处理Optional对象为空的情况。
3.3 使用orElseGet()方法:
如果Optional对象包含值,则返回该值,否则通过调用Supplier接口提供的方法来生成一个默认值。
以下是一个示例代码:
import java.util.Optional;public class OptionalDemo {public static void main(String[] args) {Optional<String> optional = Optional.empty();String value = optional.orElseGet(() -> generateDefaultValue());System.out.println("Optional的值: " + value);}public static String generateDefaultValue() {System.out.println("生成默认值");return "Default Value";}
}
在这个示例中,我们使用empty()方法创建一个空的Optional对象。然后,我们使用orElseGet()方法获取Optional对象的值,如果Optional对象为空,则通过调用generateDefaultValue()方法生成一个默认值。
generateDefaultValue()方法是一个自定义的方法,用于生成默认值。在这个示例中,我们简单地打印一条消息 “生成默认值”,然后返回默认值 “Default Value”。
输出结果为:
生成默认值
Optional的值: Default Value
由于Optional对象为空,因此会调用generateDefaultValue()方法生成默认值。
使用orElseGet()方法时,可以通过Supplier接口提供更灵活的方式来生成默认值,例如使用lambda表达式或方法引用。这使得我们可以根据需要动态生成默认值。
3.4 使用orElseThrow()方法:
如果Optional对象包含值,则返回该值,否则通过调用Supplier接口提供的方法来抛出指定的异常。
以下是一个示例代码:
import java.util.Optional;public class OptionalDemo {public static void main(String[] args) {Optional<String> optional = Optional.empty();try {String value = optional.orElseThrow(() -> new IllegalArgumentException("值为空"));System.out.println("Optional的值: " + value);} catch (IllegalArgumentException e) {System.out.println("捕获到异常: " + e.getMessage());}}
}
在这个示例中,我们使用empty()方法创建一个空的Optional对象。然后,我们使用orElseThrow()方法获取Optional对象的值,如果Optional对象为空,则通过调用Supplier接口提供的方法来抛出指定的异常。
在这个示例中,我们使用lambda表达式() -> new IllegalArgumentException(“值为空”)作为Supplier接口的实现,当Optional对象为空时,会抛出IllegalArgumentException异常,并指定异常的消息为 “值为空”。
输出结果为:
捕获到异常: 值为空
由于Optional对象为空,因此会抛出IllegalArgumentException异常,并打印异常的消息。
使用orElseThrow()方法时,可以通过Supplier接口提供更灵活的方式来抛出异常,例如使用lambda表达式或方法引用。这使得我们可以根据需要动态地抛出不同的异常。
4、转换Optional中的值:
4.1 使用map()方法:
对Optional中的值进行转换,并返回一个新的Optional对象。
以下是一个示例代码:
import java.util.Optional;public class OptionalDemo {public static void main(String[] args) {Optional<String> optional = Optional.of("Hello");Optional<String> result = optional.map(value -> value + " World");System.out.println("转换后的Optional的值: " + result.orElse(""));}
}
在这个示例中,我们使用of()方法创建一个包含值为"Hello"的Optional对象。然后,我们使用map()方法对值进行转换,将其与" World"拼接起来。最后,我们使用orElse()方法获取转换后的值,如果转换后的Optional对象为空,则返回一个空字符串。
输出结果为:
转换后的Optional的值: Hello World
由于Optional对象包含值,因此map()方法会将值与" World"拼接起来,并返回一个新的Optional对象。最后,我们通过orElse()方法获取转换后的值,并打印到控制台。
使用map()方法可以方便地对Optional对象的值进行转换,而不需要进行额外的空值检查。这使得代码更加简洁和易读。
4.2 使用flatMap()方法:
对Optional中的值进行转换,并返回一个新的Optional对象。
以下是一个示例代码:
import java.util.Optional;public class OptionalDemo {public static void main(String[] args) {Optional<String> optional = Optional.of("Hello");Optional<String> result = optional.flatMap(value -> Optional.of(value + " World"));System.out.println("转换后的Optional的值: " + result.orElse(""));}
}
在这个示例中,我们使用of()方法创建一个包含值为"Hello"的Optional对象。然后,我们使用flatMap()方法对值进行转换,将其与" World"拼接起来,并使用of()方法将结果包装成一个新的Optional对象。最后,我们使用orElse()方法获取转换后的值,如果转换后的Optional对象为空,则返回一个空字符串。
输出结果为:
转换后的Optional的值: Hello World
由于Optional对象包含值,因此flatMap()方法会将值与" World"拼接起来,并返回一个新的Optional对象。最后,我们通过orElse()方法获取转换后的值,并打印到控制台。
使用flatMap()方法可以方便地对Optional对象的值进行转换,并且可以链式调用多个转换操作。这使得代码更加灵活和易读。
相关文章:
Java8之Optional类的基本使用
文章目录 一、简介二、常见的Optional用法:1、创建Optional对象:1.1 使用of()方法:1.2 使用ofNullable()方法:1.3 使用empty()方法: 2、判断Optional是否包含值:2.1 使用isPresent()方法: 3、获…...
LinuxPTP时间同步
参考文献: http://linuxptp.sourceforge.net/ 0、硬件支持 查看网卡是否支持软硬件时间戳: sudo ethtool -T eno1 Time stamping parameters for eno1: Time stamping parameters for eno1: Capabilities: hardware-transmit (SOF_TIMESTAMPIN…...
【Django】Task1安装python环境及运行项目
【Django】Task1安装python环境及运行项目 写在最前 8月份Datawhale组队学习,在这个群除我佬的时代,写一下blog记录学习过程。 参考资源: 学习项目github:https://github.com/Joe-2002/sweettalk-django4.2 队长博客:…...
00 - 环境配置
查看所有文章链接:(更新中)GIT常用场景- 目录 文章目录 1. 环境说明2. 安装配置2.1 配置user信息2.2 config的三个作用域 3. 建git仓库3.1 把已有的项目代码纳入git管理3.2 新建的项目直接用git管理3.3 配置local的user和email3.4 优先级&…...
R语言实现计算净重新分类指数(NRI)和综合判别改善指数(IDI)
两个模型比较,与第一个模型相比,NRI(重新分对的 - 重新分错的)/总人数。IDI(新模型患者平均预测概率-旧模型患者平均预测概率)-(新模型非患者平均预测概率-旧模型非患者平均预测概率)…...
【面试总结】八股①
目录 数据库缓存穿透是什么常见的sql调优方法有哪些使用表的别名为什么能优化查询性能MySQL事务特性是哪些事务隔离级别有哪些 Java基础StringBuffer和StringBuilder的区别String直接引号新建和new String新建的区别Java中继承和实现的各种关系 消息队列Redis计算机常识缓冲击穿…...
AI绘画 | 一文学会Midjourney绘画,创作自己的AI作品(快速入门+参数介绍)
一、生成第一个AI图片 首先,生成将中文描述词翻译成英文 然后在输入端输入:/imagine prompt:Bravely running boy in Q version, cute head portrait 最后,稍等一会即可输出效果 说明: 下面的U1、U2、U3、U4代表的第一张、第二张…...
MongoDB 数据库详细介绍
MongoDB 数据库详细介绍 MongoDB(来自“Humongous”,意为巨大的)是一个开源、高性能、无模式(NoSQL)、文档导向的分布式数据库。它以其灵活性、可扩展性和强大的查询功能而闻名于世。MongoDB 使用 JSON 格式的文档来存…...
Qt在mac安装
先在app store下载好Xcode 打开Xcode 随便建个文件给它取个名字找个地方放提醒没建立git link,不用理他打开终端, 输入/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"...
STM32 F103C8T6学习笔记1:开发环境与原理图的熟悉
作为一名大学生,学习单片机有一段时间了,也接触过嵌入式ARM的开发,但从未使用以及接触过STM32C8T6大开发使用,于是从今日开始,将学习使用它~ 本文介绍STM32C8T6最小系统开发环境搭建注意问题,STM32C8T6单片…...
【Linux命令详解 | ps命令】 ps命令用于显示当前系统中运行的进程列表,帮助监控系统状态。
文章标题 简介一,参数列表二,使用介绍1. 基本用法2. 显示所有进程3. 显示进程详细信息4. 根据CPU使用率排序5. 查找特定进程6. 显示特定用户的进程7. 显示进程内存占用8. 查看进程树9. 实时监控进程10. 查看特定进程的详细信息11. 查看特定用户的进程统计…...
“超越传统的HTTP请求:深度解析Axios,打造前端开发的终极利器“
解锁前端开发的新境界 - 深入探索Axios,构建卓越的互联网应用 在当今数字化世界中,互联网应用的需求日益增长,而无论是大型企业还是初创公司,都需要一个强大而可靠的工具来处理与后端服务器之间的通信。这就是Axios的光辉时刻。作…...
【Tomcat】tomcat的多实例和动静分离
多实例: 在一台服务器上有多台Tomcat;就算是多实例 安装telnet服务,可以用来测试端口通信是否正常 yum -y install telnettelnet 192.168.220.112 80 tomcat的日志文件 cd /usr/local/tomcat/logsvim catalina.out Tomcat多实例部署&…...
Python爬虫IP代理池的建立和使用
写在前面 建立Python爬虫IP代理池可以提高爬虫的稳定性和效率,可以有效避免IP被封锁或限制访问等问题。 下面是建立Python爬虫IP代理池的详细步骤和代码实现: 1. 获取代理IP 我们可以从一些代理IP网站上获取免费或付费的代理IP,或者自己租…...
Java面试题(dubbo)
目录 什么是dubbo?为什么要用? dubbo的使用场景和核心功能? dubbo核心组件 dubbo服务注册与发现的流程 dubbo与spring的关系 dubbo与springCloud的区别 dubbo有哪些注册中心? dubbo使用的什么通讯框架? dubbo…...
JVM源码剖析之Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded异常
写在前面: 版本信息: jdk版本:jdk8u40 垃圾回收器:ParallelScavenge new/old最近在群里看到有一位老哥拿着异常信息到处问,而发生的就是java.lang.OutOfMemoryError: GC overhead limit exceeded异常,恰好…...
使用PDF文件入侵任何操作系统
提示:我们8月28号开学,所以我得快点更新了,不能拖了😥 文章目录 前言一、打开终端总结 前言 PDF文件被广泛应用于共享信息,电子邮件,网站或文档或存储系统的真实链接 它可以用于恶意软件的载体。 不要问我什么意思&am…...
强训第32
选择 D B A A 发送TCP意思应该是已经建立了连接,会超时重传。在未建立连接的时候,会放弃该链接 C A 80端口是http A 交换机攻击主要有五种:VLAN跳跃攻击 生成树攻击 MAC表洪水攻击 ARP攻击 VTP攻击 B A 2^(32-26)2^(32-27)2^(32-27)128 减去…...
vue3 setup+Taro3 调用原生小程序自定义年月日时分多列选择器,NutUI改造
vue3 setupTaro3 调用原生小程序自定义年月日时分多列选择器,NutUI改造 NutUI 有日期时间选择器,但是滑动效果太差,卡顿明显。换成 原生小程序 很顺畅 上代码: <template><view><pickermode"multiSelector&…...
git命令使用
君子拙于不知己,而信于知己。——司马迁 清屏:clear 查看当前面板的路径:pwd 查看当前面板的文件:ls 创建文件夹:mkdir 文件夹名 创建文件:touch 文件名 删除文件夹:rm -rf 文件夹名 删除文件:r…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
DeepSeek越强,Kimi越慌?
被DeepSeek吊打的Kimi,还有多少人在用? 去年,月之暗面创始人杨植麟别提有多风光了。90后清华学霸,国产大模型六小虎之一,手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水,单月光是投流就花费2个亿。 疯…...
轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...
