java中optional 常用用法

2023-11-12

Java中的Optional是一个容器对象,它可以包含一个非空值,也可以为空。它的主要作用是在编写代码时避免空指针异常。
java 8 中Optional的完整用法如下:

1. 创建Optional对象

可以通过of()方法创建一个包含非空值的Optional对象,例如:

Optional<String> optional = Optional.of("value");

也可以通过ofNullable()方法创建一个包含可能为空的值的Optional对象,例如:

Optional<String> optional = Optional.ofNullable(null);

2. 获取Optional对象的值

可以通过get()方法获取Optional对象中的非空值,例如:

String value = optional.get();

如果Optional对象中的值为空,调用get()方法会抛出NoSuchElementException异常。因此,在调用get()方法之前,最好先使用isPresent()方法判断Optional对象是否包含一个非空值。

3. 判断Optional对象是否包含非空值

可以使用isPresent()方法判断Optional对象是否包含一个非空值,例如:

if (optional.isPresent()) {
    // Optional对象包含非空值
} else {
    // Optional对象为空
}

也可以使用ifPresent()方法在Optional对象包含非空值时执行一些操作,例如:

optional.ifPresent(value -> System.out.println(value));

4. 获取Optional对象中的值或默认值

可以使用orElse()方法获取Optional对象中的值或默认值,例如:

String value = optional.orElse("default");

如果Optional对象中的值为空,则返回指定的默认值。

5. 获取Optional对象中的值或抛出异常

可以使用orElseThrow()方法获取Optional对象中的值或抛出异常,例如:

String value = optional.orElseThrow(() -> new RuntimeException("value is null"));

如果Optional对象中的值为空,则抛出指定的异常。

6. 转换Optional对象中的值

可以使用map()方法将Optional对象中的值转换为另一个类型的值,例如:

Optional<Integer> optional = Optional.of("123").map(Integer::parseInt);

如果Optional对象中的值为空,则返回一个空的Optional对象。

7. 过滤Optional对象中的值

可以使用filter()方法过滤Optional对象中的值,例如:

Optional<String> optional = Optional.of("value").filter(value -> value.startsWith("v"));

如果Optional对象中的值不满足指定的过滤条件,则返回一个空的Optional对象。

Java 9 增强

我们介绍了 Java 8 的特性,Java 9 为 Optional 类添加了三个方法:or()、ifPresentOrElse() 和 stream()。

or() 方法与 orElse() 和 orElseGet() 类似,它们都在对象为空的时候提供了替代情况。or() 的返回值是由 Supplier 参数产生的另一个 Optional 对象。

如果对象包含值,则 Lambda 表达式不会执行:

@Test
public void whenEmptyOptional_thenGetValueFromOr() {
    User result = Optional.ofNullable(user)
      .or( () -> Optional.of(new User("default","1234"))).get();

    assertEquals(result.getEmail(), "default");
}

上面的示例中,如果 user 变量是 null,它会返回一个 Optional,它所包含的 User 对象,其电子邮件为 “default”。

ifPresentOrElse() 方法需要两个参数:一个 Consumer 和一个 Runnable。如果对象包含值,会执行 Consumer 的动作,否则运行 Runnable。

如果你想在有值的时候执行某个动作,或者只是跟踪是否定义了某个值,那么这个方法非常有用:

Optional.ofNullable(user).ifPresentOrElse( u -> logger.info("User is:" + u.getEmail()),
  () -> logger.info("User not found"));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中optional 常用用法 的相关文章

  • 热重载在docker中运行的java程序

    我开发了一个java程序 应该在docker中运行 然而 我在调试docker中运行的java程序时遇到了很多痛苦 我在网上搜索 一些教程提出了像 spring dev tools 这样的工具 因为我的java程序是基于spring boo
  • 如何在 JFace 的 TableViewer 中创建复选框?

    我创建了一个包含两列的 tableViewer 我想将其中一列设为复选框 为此 我创建了一个 CheckBoxCellEditor 但我不知道为什么它不起作用 名为 tableName 的列显示其值正常 色谱柱规格如下 String COL
  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • manifest.mf 文件的附加内容的约定?

    Java JAR 中的 MANIFEST MF 文件是否有任何超出 MANIFEST MF 约定的约定 JAR规范 http download oracle com javase 1 4 2 docs guide jar jar html
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • 如何在jsp代码中导入java库?

    我有以下jsp代码 我想添加 java io 等库 我怎样才能做到这一点
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是

随机推荐

  • Android最佳实践——深入浅出WebSocket协议

    转自 https blog csdn net sbsujjbcy article details 52839540 首先明确一下概念 WebSocket协议是一种建立在TCP连接基础上的全双工通信的协议 概念强调了两点内容 TCP基础上 全
  • 树莓派+多个微雪电子Serial Expansion HAT扩展板叠加方法(扩展多个IO口、串口)

    微雪电子官方教程仅介绍了单层扩展板配置方法 因此本文参考官方教程的基础上 进行多个扩展板的叠加配置 文章目录 一 打开I2C接口 二 安装库 三 生成设备 四 堆叠教程 五 扩展IO口配置 总结 一 打开I2C接口 在终端执行 sudo r
  • Lyapunov稳定性分析1(正定函数、二次型正定判定)

    一 正定函数 1 1 定义 令V x 是向量x的标量函数 S是x空间包含原点的封闭有限区域 如果对于S中的所有x 都有 则V x 是正定的 半正定 正定函数更直观的描述如下图所示 如果条件 3 中不等式的符号反向 则称V x 是负定的 负半
  • 拼多多产品怎么引流?拼多多商品怎么引更多的流量?

    说到拼多多引流技巧 对于有资源的商家来说可能没有什么难事 而对于一些刚刚入手这个行业的商家来说未尝不是一种借鉴 博傲电商今天分享几点 首先是说下直通车引流 这个方法简单粗暴 看上去只要烧钱投放广告 流量都可以进来 是一个效果比较好的方法 但
  • android内存管理 面试题,Android面试题内存&性能篇

    Android面试题内存 性能篇 由本人整理汇总 后续将继续推出系列篇 如果喜欢请持续关注和推荐 内存分配 RAM random access memory 随机存取存储器 说白了就是内存 一般Java在内存分配时会涉及到以下区域 寄存器
  • DNS 协议是什么?完整查询过程?为什么选择使用 UDP 协议发起 DNS 查询?

    你可能了解 DNS 协议是什么 那你了解 DNS 完整查询过程是什么吗 它底层是基于 TCP 还是 UDP 喃 TCP 与 UDP 又各自负责 DNS 的哪些部分喃 引言 本文从以下几个方面循序渐进走进 DNS 协议 它的完整查询过程以及底
  • 数据结构---堆----C语言实现

    目录 堆排序介绍 功能介绍 功能实现 公式 功能合并 这里添加另一种方法 只用到了向下调整法就可排序 源码1 源码2 堆排序介绍 堆排序 Heapsort 是指利用堆这种数据结构所设计的一种排序算法 是一个近似完全二叉树的结构 并同时满足堆
  • Android中协调布局CoordinatorLayout的使用

    Android自5 0之后对UI做了较大的提升 一个重大的改进是推出了MaterialDesign库 而该库的基础即为协调布局CoordinatorLayout 几乎所有的design控件都依赖于该布局 今天我们就学习一下Coordinat
  • 程序分析 clang系列学习 (二)

    clang静态检测 clang API AST匹配部分 UseAfterMoveCheck 问题概述 示例 代码 AST CFG 检测步骤 算法大致流程 代码 这里 我主要通过clang API实现自定义的代码检测工具 采用的方式类似于cl
  • 非线性弹簧摆的仿真(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 本文模拟非线性弹簧摆 弹簧运动和摆锤运动的
  • html dom动态添加id,JavaScript/DOM - 给新创建的元素添加ID

    如何通过JavaScript DOM将元素ID应用于新创建的元素 JavaScript DOM 给新创建的元素添加ID 我写的代码创建了一个由按钮触发的表 我需要为此表应用一个唯一的ID 因此它可以与我的网站上出现的其他人的样式不同 这里是
  • 计算机操作系统之期末考试复习——进程的基本状态及转换

    进程的基本状态 就绪状态 Ready 进程已处于准备好运行的状态 即进程已分配到除CPU以外的所有必要资源后 只要获得CPU 便可立即执行 执行状态 Running 进程以获得CPU 其程序正在执行的状态 阻塞状态 Block 正在执行的进
  • Python调用海康威视网络相机之——python调用海康威视C++的SDK

    运行环境 Win10系统 64位 Anaconda3 python 3 5 5 基于anaconda环境 opencv 3 4 2 早前就已经安装了 本文不会讲如何安装 Visual Studio 2015 硬件 DS 2CD3T56DWD
  • 记录qt窗口在拖动过程中出现的问题

    问题描述 在窗口拖动的过程中刚开始可以流畅的拖动窗口 但是一小会儿之后出现窗口拖不动的现象 或者按下鼠标在拖动区域内可以流畅拖动 但是按下鼠标朝一个方向拖动后 释放鼠标 按照此操作操作几次后 出现窗口拖不动的情况 但是过一会儿后窗口又可以被
  • 使用Python批量将EXCEL转为CSV文件

    今天遇到一个批量将100多个EXCEL 且每个excel中有多个sheet页 转为CSV文件的需求 同事使用wps右键逐个拆分 效率实在太慢 网上查了一下 使用pandas库中的to csv 方法可以解决这个问题 下面这段代码可以批量处理e
  • hadoop join之map side join

    在本例中 我们仍然采用上一例中的数据文件 之所以存在reduce side join 是因为在map阶段不能获取所有需要的join字段 即 同一个key对应的字段可能位于不同map中 Reduce side join是非常低效的 因为shu
  • 前端向后台传值的方式及相关注解

    文章目录 传参方式 QueryString传参 访问路径传参 form表单传参 ajax方式进行JSON传参 常用注解 RequestBody RequestParam 为前端提供接口 需要对传参方式有所熟悉 以下有几种常用的传参方式和常见
  • 连接vc显示服务器无法解释客户端请,vc服务器和客户端配置

    vc服务器和客户端配置 内容精选 换一换 当出现以下问题时 可以参考本章节排查解决 可以直接访问后端业务 但是无法通过负载均衡访问后端业务 通过私网IP可以访问负载均衡 但是公网IP无法访问负载均衡 后端服务器健康检查异常 客户端通过负载均
  • NDK与Cygwin配置

    1 Android 开发环境搭建 Android开发环境搭建不是重点 相信看此文章的很多人都已经搭建成功 这里随便概述性的说说 下载 JDK 下载 Eclipse 下载 Android SDK 启动Eclipse 安装 ADT 2 下载安装
  • java中optional 常用用法

    Java中的Optional是一个容器对象 它可以包含一个非空值 也可以为空 它的主要作用是在编写代码时避免空指针异常 java 8 中Optional的完整用法如下 1 创建Optional对象 可以通过of 方法创建一个包含非空值的Op