Java8 Optional 类常用方法 Java8 Optional orElse 、orElseGet 、orElseThrow 方法区别

2023-05-16

Java8 Optional 类常用方法 Java8 Optional orElse 、orElseGet 、orElseThrow 方法区别

一、概述

        Optional 类,是Java8 新增加的一个对象容器。主要的功能有:对象的创建、获取、判断、过滤,映射等。

  • 创建常用的方法有:empty 、of 、ofNullable
  • 获取: get
  • 判断: isPresent 、ifPresent 、orElse 、orElseGet 、orElseThrow
  • 过滤: filter
  • 映射: map 、flatMap

        本文将演示各个方法的作用,并着重比较:orElse 、orElseGet 、orElseThrow 等,类似方法的区别。

二、方法用法

        1、of 和 ofNullable 方法:

/**
 * Description:  of 和 ofNullable 方法的区别
 * <br> of 不允许为null ,否则会抛出 NPE
 * <br> ofNullable ,允许为 null
 * @return  void
 * @version v1.0
 * @author wu
 * @date 2022/11/23 10:14
 */
@Test
public void ofNullableTest() throws Exception {
    final Optional<String> s = Optional.of("111");
    final Optional<String> s1 = Optional.ofNullable("222");
    System.out.println(s);
    System.out.println(s1);

    final Optional<Object> s3 = Optional.ofNullable(null);
    System.out.println(s3);

    final Optional<String> s4 = Optional.of(null);
    System.out.println(s4);
}

        1.1、输出结果:

Optional[111]
Optional[222]
Optional.empty

java.lang.NullPointerException
....

        2、orElse 、orElseGet 方法

/**
 * Description: orElse 中方法调用,一定会执行; orElseGet 当前面的值为null时,才会执行
 * @return  void
 * @version v1.0
 * @author wu
 * @date 2022/11/26 20:44
 */
@Test
public void orElseGetTest() throws Exception {
    final String s = Optional.of("123").orElse(get("orElse"));
    final String s1 = Optional.of("456").orElseGet(() -> get("orElseGet"));
    System.out.println(s);
    System.out.println(s1);

    String str = null;
    final String s2 = Optional.ofNullable(str).orElse(get("orElse22"));
    final String s3 = Optional.ofNullable(str).orElseGet(()->get("orElseGet22"));
    System.out.println(s2);
    System.out.println(s3);
}

public String get(String s){
    System.out.println(s+"===> get 方法运行 ...");
    return "GET返回值";
}

        2.1、输出结果:

orElse===> get 方法运行 ...
123
456
orElse22===> get 方法运行 ...
orElseGet22===> get 方法运行 ...
GET返回值
GET返回值

        3. orElseThrow 方法

/**
 * Description: orElseThrow : value 为null,则抛出异常
 * @return void
 * @version v1.0
 * @author wu
 * @date 2023/1/4 11:14
 */
@Test
public void orElseThrowTest() throws Exception{
    final String s = Optional.ofNullable("null哈哈").orElseThrow(() -> new RuntimeException("参数为空异常"));
    System.out.println("s = " + s);
    final Object s2 = Optional.ofNullable(null).orElseThrow(() -> new RuntimeException("参数为空异常123"));
    System.out.println("s2 = " + s2);
}

        3.1、输出结果:

s = null哈哈

java.lang.RuntimeException: 参数为空异常123
...

        4、isPresent 方法:

/**
 * Description: isPresent: 判断value 是否不为null, value = null, false ;
 * @return void
 * @version v1.0
 * @author wu
 * @date 2023/1/4 11:19
 */
@Test
public void isPresentTest() throws Exception{
    final boolean b1 = Optional.ofNullable(null).isPresent();
    System.out.println("b1 = "+ b1);

    final boolean b2 = Optional.ofNullable("null 123").isPresent();
    System.out.println("b2 = "+ b2);
}

        4.1、输出结果:

b1 = false
b2 = true

        5、ifPresent 方法:

/**
 * Description: ifPresent: value != null ,则执行 Consumer 接口
 * @return void
 * @version v1.0
 * @author wu
 * @date 2023/1/4 14:28
 */
@Test
public void ifPresentTest() throws Exception{
    Optional.ofNullable(null).ifPresent(System.out::println);
    Optional.ofNullable("value 不为 null").ifPresent(System.out::println);
}

        5.1、输出结果:

value 不为 null

        6、 filter 方法:

/**
 * Description: filter 方法:执行Predicate接口,满足条件返回当前对象;不满足,返回 Optional.EMPTY 常量
 * @return void
 * @version v1.0
 * @author wu
 * @date 2023/1/4 14:36
 */
@Test
public void filterTest() throws Exception{
    final Optional<Object> o = Optional.ofNullable(null).filter(Objects::nonNull);
    System.out.println(o);
    final Optional<String> o2 = Optional.ofNullable("null 不为空").filter((val)->Objects.nonNull(val));
    System.out.println(o2);
}

        6.1、输出结果:

Optional.empty
Optional[null 不为空]

        7、 map 和 flatMap 方法:

/**
 * Description: map 和 flatMap 方法
 * <br> map: 判断 value 是否为null ,value为null,则返回 Optional.EMPTY 常量 ; value不为null,则返回 Optional包装结果
 * <br> flatMap 方法:value为null,返回值同 map方法; value不为null,则返回入参的Optional包装参数
 * @return void
 * @version v1.0
 * @author wu
 * @date 2023/1/4 15:45
 */
@Test
public void mapTest() throws Exception{
    final User user = new User();
    user.setName("小明");
    final Optional<String> optional1 = Optional.of(user).map(User::getName);
    System.out.println(optional1.get());

    final User user2 = new User();
    user2.setName("小红");
    final Optional<User> op = Optional.of(user2);

    final Optional<User> optional2 = Optional.of(user).flatMap((val) -> op);
    System.out.println(optional2.get().getName());

    final Optional<String> optiona3 = Optional.of(user2).flatMap(this::getUserName);
    System.out.println(optiona3.get());
}

public Optional<String> getUserName(User user){
    return Optional.ofNullable(user).map(User::getName);
}

static class User{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

        7.1、输出结果:

小明
小红
小红

三、总结

        1、orElse 和 orElseGet 方法区别:

  • orElse 方法:无论 value 是否为null,都会执行 orElse 里的方法
  • orElseGet 方法:只有 value=null 时,才会执行 orElseGet 里的方法

        建议平时使用 orElseGet 方法少用 orElse 方法

        2、map 和 flatMap 方法区别:

  • map 方法: map: 判断 value 是否为null ,value为null,则返回 Optional.EMPTY 常量 ; value不为null,则返回 Optional包装结果
  • flatMap 方法:value为null,返回值同 map方法; value不为null,则返回入参的Optional包装参数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java8 Optional 类常用方法 Java8 Optional orElse 、orElseGet 、orElseThrow 方法区别 的相关文章

  • 边缘计算简介-1

  • 给Qt程序添加图片

    首先双击列表中的ui文件 xff0c 打开 设计器 然后从左侧列表拖一个 label 进去 然后右键点击 xff0c 出现菜单 xff0c 点击 改变样式表 然后在新出现的窗口里面输入image url 图片路径 jpg 比如 xff1a
  • 禁用win10自带的微软输入法!

    1 点击电脑主屏幕左下角开始图标 xff0c 选择设置 2 选择 时间和语言 gt 语言 gt 中文 3 单击选项 xff0c 删除微软拼音键盘即可 xff0c 这样就不会在不小心按到Ctrl 43 Shift建时 xff0c 出现切换输入
  • Office出现xukezheng问题,如何有效解决

    亲测有效哦 xff01 看原文原文出处 版本Office2019专业增强版
  • MatLab数据结构

    命名规则 xff1a 变量名区分大小写 必须以字母开头 xff0c 可以由字母 数字和下划线组成 xff0c 但不能使用标点 clc xff1a 清屏命令行窗口 clear all 清除工作区的变量 xff0c 但不清理命令行窗口 数据类型
  • MatLab矩阵运算

    1 矩阵构造及定义 A 61 1 3 5 7 8 9 构造多行矩阵 D 61 2 4 构造单行矩阵 B 61 1 2 9 最小值 xff1a 步长 xff1a 最大值 C 61 repmat D 4 3 将D的行重复四次 xff0c 列重复
  • MatLab补充

    1 matlab中所有的变量都是数组 x 61 4 实际是x数组 xff08 11大小 xff09 中存了4 y 61 6 9 是大小为12的数组存储y的数值 当您用空格 xff08 或逗号 xff09 分隔数值时 xff08 如前面的任务
  • MatLab使用注意事项

    1 在命令行输入指令 xff0c 当不加 xff1b 作为结尾时 xff0c 系统会在命令窗口输出数值 当使用 xff1b 作为命令结尾时 xff0c 系统不再输出数值 xff0c 但是会在工作区存储变量 对应的值 2 变量以字母开头 xf
  • EdgeCloudSim仿真实验平台使用介绍

    跑程序前的准备工作 xff1a Java环境配置 网上搜教程吧 xff0c 按着提示做就可以我使用的工具 xff1a Eclipse项目链接 xff1a 其中包含EdgeCloudSim英文说明文档和EdgeCloudSim工程文件夹 链接
  • 内存地址的应用

    学习python时真正了解了内存地址 cpu中的数据分类 cpu中的数据分为两类 xff1a 数据和指令 数据 xff1a 由指令产生的结果 指令 xff1a 键盘 鼠标等电脑输入设备操作以及人为对主机输入设备进行的目的性操作 值得注意的是
  • World插入图片显示不全

    在文档中直接插入图片 xff0c 显示不全 xff0c 具体的说是只能看到图片底部部分 给出两种办法解决 1 局部修改 把光标位置置于图片的末尾 xff0c 然后点击鼠标右键 xff0c 选择 段落 选项进入 段落 文本框 xff0c 选择
  • 快速消除Word文档中空格

    消除Word文档中的空格 0 待处理文档 1 选择文档的替换功能 2 选择 特殊格式 中的 段落标记p 3 设置成对应格式 4 选择全部替换 xff0c 效果如下 问题分析 xff1a 可以看出执行上述操作一次后 xff0c 相当于是扫描了
  • CCF推荐国际学术会议和期刊目录2019年

    链接 xff1a 全目录下载地址
  • 2022教资押题

    1 试题类型 2 具体文件夹 3 百度网盘链接 xff1a 链接 xff1a https pan baidu com s 17ZlLeE2E8Rzz7ELHptE8Fg 提取码 xff1a 9vky
  • 强化学习Q-learning入门教学

    1 问题描述 2 图形化展示 3 reward矩阵构建 4 Q表构建 这里需要说明的是Q表的转移规则原本是 xff1a 本例中为了方便介绍 xff0c 将 值设为1了 原文讲解的通俗易懂 xff0c 有兴趣的可以看一下 出处 xff1a h
  • 英文文献代码查找

    原文链接 xff1a https blog csdn net weixin 45656790 article details 109271019
  • Word中插入集合和元素的包含符号

    1 比较简单 xff0c 是元素和集合的包含关系 查找 xff1a word gt 插入 gt 符号栏下拉 xff0c 选择基础数学 2 集合间的包含关系 四个数字 xff0c 代表一个 输入文档中的指定位置 xff0c 选中数字以后 xf
  • 微信PC端聊天界面表情包无法显示

    我试成功的一个办法 xff0c 分享一下 具体步骤 xff1a 1 找到微信聊天界面的设置选项 xff0c 如图 2 进入微信文件保存位置 3 进入WeChat Files All Users config目录 4 删除config dat
  • MathType 提示需要一个新版本的MT Extra(True Type)字体

    1 打开C Windows Fonts文件夹 xff0c 若里面有MT Extra TrueType 字体或其快捷方式 xff0c 则将其删除 2 找到MathType安装目录下C Program Files x86 MathType Fo
  • Word快捷键设置上下标;Word取消表格虚线;Word查找数学符号

    问题1 快捷键设置上下角标 这个在论文写作时比较常用 xff0c 本人也是最近在写大论文 xff0c 遇到了这个情况 Word和Visio中 xff0c 都可以使用 步骤 xff1a 选中即将成为上下标的内容 xff0c 上标快捷键 xff

随机推荐

  • xcode中xib使用之轻松学习

    1 创建xib文件 在工程目录中New Files xff0c 选择user interface类型中的empty创建一个空的interface builder document文件 文件名没有强制的要求 xff0c 最好使用 前缀 xff
  • 用Opencv打造一台自动视觉目标跟踪系统

    平移 倾斜伺服装置 xff0c 帮助摄像机使用视觉自动跟踪颜色对象 简介 现在我们将使用我们的设备帮助相机自动跟踪颜色对象 xff0c 如下所示 xff1a OpenCV可免费用于学术和商业用途 它具有C 43 43 xff0c C xff
  • error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools"【转载+修改】

    error Microsoft Visual C 43 43 14 0 is required Get it with Microsoft Visual C 43 43 Build Tools http landinghub visuals
  • 如何使用OpenCV实现多张图像拼接

    先来看看OpenCV官方的例子得到效果是非常的好 xff0c 输入的images如下 xff1a 效果 xff1a Stitcher类与detail命名空间 OpenCV提供了高级别的函数封装在Stitcher类中 xff0c 使用很方便
  • 如何使用OpenCV对物体进行搜索检测与识别

    在本教程中 xff0c 我们将了解对象检测中称为 选择性搜索 的重要概念 我们还将用C 43 43 和Python共享OpenCV代码 物体检测与物体识别 对象识别算法识别图像中存在哪些对象 它将整个图像作为输入 xff0c 并输出该图像中
  • 一种基于深度学习的方法来检测摩托车头盔的使用

    背景 据统计使用摩托车头盔可以将道路交通事故中摩托车驾驶员致命伤害的可能性降低42 xff05 xff0c 尽管如此 xff0c 遵守摩托车头盔还是较少 xff0c 尤其是在发展中国家 xff0c 为了有效开展针对性的头盔使用运动 xff0
  • 偏振光相机1——偏振光

    光的电磁波属性 光是一种电磁波 xff0c 这个概念大家应该不陌生 既然是电磁波 xff0c 那我们从电磁波的特性上来看它有哪些属性 用图1中的交变电磁场来描述光的特性 xff0c 电场和磁场在空间中相互垂直 xff0c 它们同时与光的传播
  • 偏振光相机2——索尼大法

    Stokes参量 在上一篇 偏振光相机 偏振光 中 xff0c 我们知道偏振光有线性偏振光 椭圆偏振光 圆偏光 那么如何定量的描述偏振光呢 xff1f Stokes矢量是一种广泛用来描述偏振光属性的方法 图1 不同类型的偏振光 线性偏振光和
  • 偏振光相机3——偏振应用

    在之前的2篇中 xff0c 介绍了偏振光的基本概念和基于SONY最新CMOS偏振传感器芯片的相机 在本篇中 xff0c 我们来看看偏振相机的一些应用 偏振相机的应用离不开偏振光 xff0c 那么先看看如何得到偏振光信息 如何获取偏光 在 偏
  • 【干货】生成对抗网络GANs算法在医学图像领域应用总结

    Goodfellow等人 介绍了生成对抗网络 xff08 GAN xff09 以模拟数据分布 由于与两个基本属性相关的原因 xff0c GAN可以合成真实图像 GAN是一种无监督的训练方法 xff0c 可以通过类似于人类学习图像特征的方式获
  • 图像算法之3D人脸识别技术原理概述

    随着深度学习技术的进步 xff0c 面部相关任务的研究也成为学术界和工业界的热门话题 众所周知的面部任务通常包括面部检测 xff0c 面部识别 xff0c 面部表情识别等 xff0c 其主要使用2D RGB面部 xff08 通常包括一些纹理
  • 如何使用OpenCV计算机视觉检测帕金森病图片

    在本教程中 xff0c 您将学习如何使用OpenCV和机器学习在手绘的螺旋和波浪图像中自动检测帕金森病 本教程来自来自巴西的博士生Joao Joao有兴趣利用计算机视觉和机器学习基于几何图形 xff08 即螺旋和符号波 xff09 自动检测
  • OpenCV快速寻找图像差异

    如何使用结构相似性指数 xff08 SSIM xff09 将两个图像与Python进行比较 使用这种方法 xff0c 我们能够轻松确定两个图像是否相同或由于轻微的图像处理 xff0c 压缩伪像或有目的的篡改而产生差异 今天我们将扩展SSIM
  • C++17使用std::optional表示一个可能存在的值

    文章目录 前言返回一个bool值使用 std optional 改写总结 前言 平时写代码会遇到一种传递参数特殊值标记特殊流程 xff0c 或者函数返回值存在魔法数的情况 xff0c 很需要一种标记参数或返回值状态的结构 xff0c 那么在
  • Redhat进程管理

    进程管理 概论 xff1a 程序 xff1a 静态的代码 xff0c 占用磁盘空间 进程 xff1a 动态的代码 xff0c 占用内存 cpu xff08 提供服务的主体 xff09 进程的唯一标识 xff1a PID 编号 父进程 子进程
  • ETCD 高可用集群 Centos7

    ETCD 高可用集群 在本地三台虚拟机以static方式搭建ETCD集群测试环境 xff0c 均为Centos7 一 准备工作 1 主机名及IP 主机名IPvm5192 168 56 10vm6192 168 56 11vm7192 168
  • Python 蓝桥杯 七段码

    一 题目描述 二 题目分析 我使用的是暴力解决 xff0c 因为一共就7位 xff0c 但是容易出现漏算或多算 xff0c 经过很久的找错误和改正才得到答案80 一个较易弄错的问题就是出现3中组合 xff1a abde afcd bcef
  • Java XML转换为JSON XML解析 转换为JSON Java 实现JSON转换为XML json转xml

    Java XML转换为JSON XML解析 转换为JSON Java 实现JSON转换为XML json转xml 一 转换代码 1 XML字符串转换为JSON description XML字符串转换为JSON 64 param strXM
  • 5年的人寿保险 、定期存款 和 基金定投 计划对比

    5年的人寿保险 定期存款 和 基金定投 计划对比 一 5年人寿保险情况 市面上普遍的5年人寿保险 xff0c 预期分红的利息是 4 2 情况 xff0c 实际也存在少分 或者不分红的可能 xff0c 承诺的保本利息在不到2 的情况 既然为保
  • Java8 Optional 类常用方法 Java8 Optional orElse 、orElseGet 、orElseThrow 方法区别

    Java8 Optional 类常用方法 Java8 Optional orElse orElseGet orElseThrow 方法区别 一 概述 Optional 类 xff0c 是Java8 新增加的一个对象容器 主要的功能有 xff