当前位置: 首页 > news >正文

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用法&#xff1a;1、创建Optional对象&#xff1a;1.1 使用of()方法&#xff1a;1.2 使用ofNullable()方法&#xff1a;1.3 使用empty()方法&#xff1a; 2、判断Optional是否包含值&#xff1a;2.1 使用isPresent()方法&#xff1a; 3、获…...

LinuxPTP时间同步

参考文献&#xff1a; http://linuxptp.sourceforge.net/ 0、硬件支持 查看网卡是否支持软硬件时间戳&#xff1a; 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组队学习&#xff0c;在这个群除我佬的时代&#xff0c;写一下blog记录学习过程。 参考资源&#xff1a; 学习项目github&#xff1a;https://github.com/Joe-2002/sweettalk-django4.2 队长博客&#xff1a…...

00 - 环境配置

查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;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)

两个模型比较&#xff0c;与第一个模型相比&#xff0c;NRI&#xff08;重新分对的 - 重新分错的&#xff09;/总人数。IDI&#xff08;新模型患者平均预测概率-旧模型患者平均预测概率&#xff09;-&#xff08;新模型非患者平均预测概率-旧模型非患者平均预测概率&#xff09…...

【面试总结】八股①

目录 数据库缓存穿透是什么常见的sql调优方法有哪些使用表的别名为什么能优化查询性能MySQL事务特性是哪些事务隔离级别有哪些 Java基础StringBuffer和StringBuilder的区别String直接引号新建和new String新建的区别Java中继承和实现的各种关系 消息队列Redis计算机常识缓冲击穿…...

AI绘画 | 一文学会Midjourney绘画,创作自己的AI作品(快速入门+参数介绍)

一、生成第一个AI图片 首先&#xff0c;生成将中文描述词翻译成英文 然后在输入端输入&#xff1a;/imagine prompt:Bravely running boy in Q version, cute head portrait 最后&#xff0c;稍等一会即可输出效果 说明&#xff1a; 下面的U1、U2、U3、U4代表的第一张、第二张…...

MongoDB 数据库详细介绍

MongoDB 数据库详细介绍 MongoDB&#xff08;来自“Humongous”&#xff0c;意为巨大的&#xff09;是一个开源、高性能、无模式&#xff08;NoSQL&#xff09;、文档导向的分布式数据库。它以其灵活性、可扩展性和强大的查询功能而闻名于世。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:开发环境与原理图的熟悉

作为一名大学生&#xff0c;学习单片机有一段时间了&#xff0c;也接触过嵌入式ARM的开发&#xff0c;但从未使用以及接触过STM32C8T6大开发使用&#xff0c;于是从今日开始&#xff0c;将学习使用它~ 本文介绍STM32C8T6最小系统开发环境搭建注意问题&#xff0c;STM32C8T6单片…...

【Linux命令详解 | ps命令】 ps命令用于显示当前系统中运行的进程列表,帮助监控系统状态。

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 基本用法2. 显示所有进程3. 显示进程详细信息4. 根据CPU使用率排序5. 查找特定进程6. 显示特定用户的进程7. 显示进程内存占用8. 查看进程树9. 实时监控进程10. 查看特定进程的详细信息11. 查看特定用户的进程统计…...

“超越传统的HTTP请求:深度解析Axios,打造前端开发的终极利器“

解锁前端开发的新境界 - 深入探索Axios&#xff0c;构建卓越的互联网应用 在当今数字化世界中&#xff0c;互联网应用的需求日益增长&#xff0c;而无论是大型企业还是初创公司&#xff0c;都需要一个强大而可靠的工具来处理与后端服务器之间的通信。这就是Axios的光辉时刻。作…...

【Tomcat】tomcat的多实例和动静分离

多实例&#xff1a; 在一台服务器上有多台Tomcat&#xff1b;就算是多实例 安装telnet服务&#xff0c;可以用来测试端口通信是否正常 yum -y install telnettelnet 192.168.220.112 80 tomcat的日志文件 cd /usr/local/tomcat/logsvim catalina.out Tomcat多实例部署&…...

Python爬虫IP代理池的建立和使用

写在前面 建立Python爬虫IP代理池可以提高爬虫的稳定性和效率&#xff0c;可以有效避免IP被封锁或限制访问等问题。 下面是建立Python爬虫IP代理池的详细步骤和代码实现&#xff1a; 1. 获取代理IP 我们可以从一些代理IP网站上获取免费或付费的代理IP&#xff0c;或者自己租…...

Java面试题(dubbo)

目录 什么是dubbo&#xff1f;为什么要用&#xff1f; dubbo的使用场景和核心功能&#xff1f; dubbo核心组件 dubbo服务注册与发现的流程 dubbo与spring的关系 dubbo与springCloud的区别 dubbo有哪些注册中心&#xff1f; dubbo使用的什么通讯框架&#xff1f; dubbo…...

JVM源码剖析之Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded异常

写在前面&#xff1a; 版本信息&#xff1a; jdk版本&#xff1a;jdk8u40 垃圾回收器&#xff1a;ParallelScavenge new/old最近在群里看到有一位老哥拿着异常信息到处问&#xff0c;而发生的就是java.lang.OutOfMemoryError: GC overhead limit exceeded异常&#xff0c;恰好…...

使用PDF文件入侵任何操作系统

提示&#xff1a;我们8月28号开学,所以我得快点更新了&#xff0c;不能拖了&#x1f625; 文章目录 前言一、打开终端总结 前言 PDF文件被广泛应用于共享信息&#xff0c;电子邮件&#xff0c;网站或文档或存储系统的真实链接 它可以用于恶意软件的载体。 不要问我什么意思&am…...

强训第32

选择 D B A A 发送TCP意思应该是已经建立了连接&#xff0c;会超时重传。在未建立连接的时候&#xff0c;会放弃该链接 C A 80端口是http A 交换机攻击主要有五种&#xff1a;VLAN跳跃攻击 生成树攻击 MAC表洪水攻击 ARP攻击 VTP攻击 B A 2^(32-26)2^(32-27)2^(32-27)128 减去…...

vue3 setup+Taro3 调用原生小程序自定义年月日时分多列选择器,NutUI改造

vue3 setupTaro3 调用原生小程序自定义年月日时分多列选择器&#xff0c;NutUI改造 NutUI 有日期时间选择器&#xff0c;但是滑动效果太差&#xff0c;卡顿明显。换成 原生小程序 很顺畅 上代码&#xff1a; <template><view><pickermode"multiSelector&…...

git命令使用

君子拙于不知己,而信于知己。——司马迁 清屏&#xff1a;clear 查看当前面板的路径&#xff1a;pwd 查看当前面板的文件&#xff1a;ls 创建文件夹&#xff1a;mkdir 文件夹名 创建文件&#xff1a;touch 文件名 删除文件夹&#xff1a;rm -rf 文件夹名 删除文件&#xff1a;r…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...