Optional详解

news2025/7/14 0:50:27

一 有什么用

  • 对象的NPE处理
  • 简化if else代码

二 怎么用

Optional 就好像是一个包装类,可以把具体的数据封装到 Optional 对象内部,然后我们去使用 Optional 中封装好的方法操作封装进去的数据就可以非常优雅的避免空指针异常

2.1 创建Optional对象

  • Optional.empty(): 创建一个空的 Optional 实例

在这里插入图片描述

  • Optional.of(T t):创建一个 Optional 实例,当 t为null时抛出异常

image.png

  • Optional.ofNullable(T t):创建一个 Optional 实例,但当 t为null时不会抛出异常,而是返回一个空的实例(常用)

在这里插入图片描述

2.2 获取Optional实例中的对象

  • get():获取optional实例中的对象,当optional 容器为空时报错**(不推荐)**

在这里插入图片描述

  • authorOptional.ifPresent(author -> System.out.println(author.getName()));(推荐)
    在这里插入图片描述

2.3 判断

  • isPresent():判断optional是否为空,如果空则返回false,否则返回true
    在这里插入图片描述

  • ifPresent(Consumer c):如果optional不为空,则将optional中的对象传给Comsumer函数**(判断其封装的数据是否为空(value 表示封装在 Optional 的对象),不为空时才会执行具体的消费代码)**
    在这里插入图片描述

  • orElse(T other):如果optional不为空,则返回optional中的对象;如果为null,则返回 other 这个默认值**(推荐)**
    在这里插入图片描述

  • orElseGet(Supplier other):如果optional不为空,则返回optional中的对象;如果为null,则使用Supplier函数生成默认值other**(推荐)**
    在这里插入图片描述
    在这里插入图片描述

  • orElseThrow(Supplier exception):如果optional不为空,则返回optional中的对象;如果为null,则抛出Supplier函数生成的异常**(推荐)**
    在这里插入图片描述
    在这里插入图片描述

2.4 过滤

  • filter(Predicate p):如果optional不为空,则执行断言函数p,如果p的结果为true,则返回原本的optional,否则返回空的optional**(Optional为空、无过滤成功的数据都会使得返回的Optional为空)**

2.5 映射

  • map(Function<T, U> mapper):如果optional不为空,则将optional中的对象 t 映射成另外一个对象 u,并将 u 存放到一个新的optional容器中。
    在这里插入图片描述

  • flatMap(Function< T,Optional> mapper):跟上面一样,在optional不为空的情况下,将对象t映射成另外一个optional

在这里插入图片描述

区别:map会自动将u放到optional中,而flatMap则需要手动给u创建一个optional(flatMap返回的时候没有使用Optional封装)

2.6 案例

2.6.1 嵌套取值
String str = Optional
    //处理A对象为空的情况,即使A对象为null,也有Optional容器包裹
    .ofNullable(context.getA()) 
    //处理A对象为空的情况,即使A对象为null,也有Optional容器包裹
    .map(A::getB)
    .map(B::getC)
    .map(C::getD)
    //一直嵌套获取值,从A取B,从B取C,以此类推,只要其中一个对象为null,
    //都会导致最终结果为null,所以取默认值default
    .orElse("default");

2.6.2 集合判空并联合Stream流
List<B>  list = Optional
    .ofNullable(A.getList())
    .orElse(Lists.newArrayList())
    .stream()
    .map(item -> DefaultWrapperMapStructMapper.INSTANCE.convert(item))
    .collect(Collectors.toList());
2.6.3 集合判空并联合Stream流(多重循环)
Optional.ofNullable(checkMergeRuleContextItemFields)
    //使用supplier型接口,生成默认对象
    .orElseGet(Collections::emptyMap)
    .forEach((fieldPath, fieldName) -> {
        List resultList = orderInfo.getOrderItemDTOList().stream()
            .map(orderItemDTO -> {
                try {
                    return BeanUtil.convert(orderItemDTO);
                } catch (Throwable e) {
                    throw new RuntimeException();
                }
            })
            .filter(Objects::nonNull)
            .collect(Collectors.toList());
    });

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

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

相关文章

CellMarker 2.0 | 细胞标志物数据库更新啦!~(附使用指南)

1写在前面 细胞标志物&#xff08;Cellmarker&#xff09;可以用来定义、区别不同细胞。随着单细胞测序&#xff08;scRNA-seq&#xff09;的普及&#xff08;主要是便宜了&#x1f4c9;&#xff09;&#xff0c;相关的研究也越来越多。&#x1f973; 在进行细胞注释的时候&…

【菜菜的sklearn课堂笔记】逻辑回归与评分卡-二元逻辑回归损失函数的数学解释,公式推导与解惑

视频作者&#xff1a;菜菜TsaiTsai 链接&#xff1a;【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili 白板推导里有写过程&#xff0c;但是当时理解的不太好&#xff0c;ψ(xi,ω)\psi(x_{i},\omega)ψ(xi​,ω)的理解有点问题也就是下面的yθ(xi)y_…

Docker(二):Windows系统安装Docker

安装环境 在安装之前&#xff0c;Windows 版 Docker 的环境有以下要求&#xff1a; 1、Windows 10 Pro&#xff08;专业版&#xff09; / Enterprise&#xff08;企业版&#xff09; / Education&#xff08;教育版&#xff09;&#xff08;1607 Anniversary Update、Build 14…

Vue3路由——基本使用、动态路由、路由正则、重复参数、嵌套路由、编程式导航、命名路由、重定向、别名、路由模式与导航守卫

文章目录P23 Vue3路由的基本使用P24 动态路由和404NotFound动态路由404NotFoundp25 路由正则与重复参数路由正则重复参数p26 嵌套路由p27 使用js跳转页面(编程式导航)p28 命名路由与重定向别名命名路由重定向别名p29 路由模式与导航守卫P23 Vue3路由的基本使用 npm init vite-…

[附源码]java毕业设计基于的花店后台管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

《Nature》STING 与 cGAMP 结合导致 TBK1 激酶募集和活化

来自细菌或病毒的核酸在受感染的细胞中会产生强效的免疫反应&#xff0c;而病原体衍生核酸的检测是宿主感知感染并启动保护性免疫反应的核心策略。cGAS (Cyclic GMP-AMP synthase) 是一种双链 DNA 传感器&#xff0c;可催化 cGAMP&#xff08;cyclic GMP-AMP&#xff09;的合成…

中间件简介

中间件简介 1. 中间件概述 随着网络和软件技术的飞速发展&#xff0c;软件面临更多的问题&#xff0c;例如&#xff1a;不同的操作系统、不同的网络环境等。在每个软件中解决这些问题加大了软件开发人员的负担&#xff0c;因此倾向于将这些具有广泛应用的共性功能提取出来&am…

【离散数学】第二章 测试

1.单选题 谓词推理要 A. 先US&#xff0c;后ES B. 先ES&#xff0c;后US 正确答案&#xff1a; B 2.单选题 前提: (∀x)(F(x)→G(x))&#xff0c;(∃x)F(x)&#xff0c; 结论: (∃x)G(x)。 A. 成立 B. 不成立 正确答案&#xff1a; A 3.单选题 根据ES规则&#xff0c;若(∃x)P(…

gRPC(八)生态 grpc-gateway 应用:同一个服务端支持Rpc和Restful Api

目录前言一、gRPC-Gateway概述1、简述2、出现二、准备工作1、目录结构2、环境准备1&#xff09;Protobuf2&#xff09;gRPC3&#xff09;gRPC-Gateway3、编写 IDL1&#xff09;google.api2&#xff09;hello.proto3&#xff09;编译proto4、制作证书1&#xff09;生成CA根证书2…

香港服务器一定比美国服务器好吗?

香港服务器一定比美国服务器好吗?从出海业务兴起以来就有不少的站长拿较为热门的香港服务器和美国服务器来作出对比&#xff0c;对其两者孰优孰劣的探讨一直都没有停止过。在这里&#xff0c;我们对两者做个比较。 香港服务器和美国服务器两者的对比&#xff1a; 1. 香港服务器…

linux笔记(3):东山哪吒STU开发板初体验

文章目录1.开发板上电观察串口1.1 从nand flash启动1.2 从SD卡启动2.上传文件到开发板2.1 使用FileZilla软件连接开发板2.2 使用ADB软件双11下单后&#xff0c;经过多日的等待&#xff0c;终于在昨天下午收到了开发板。在等待的过程中&#xff0c;看了一下文档和B站东山老师的视…

Rhino Linux:滚动发布但也很稳定的 Ubuntu

导读滚动发布的 Ubuntu 发行版&#xff1f;等等&#xff0c;什么&#xff1f; Rhino Linux 听起来不错……Ubuntu but rolling but also stable! Thats what Rhino Linux aims to be Rhino Linux 将成为 Rolling Rhino Remix 的继任者。这个由 http.llamaz 构建的 Linux 发行版…

01 Jenkins CICD 之 Git 命令使用

1. 前言 由于项目没有外网&#xff0c;需要在内网打镜像。但自己对git 还不是太熟悉。看着pipline 一脸的懵。所有针对git 命令在工作中常用的参数及用法简单学习记录下 git 技能树链接 2. git 常用参数 2.1 git全局设置 git config --global user.name "xxxxx" …

STC51单片机27——控制无刷电机

编写程序控制电调&#xff1a; #include<reg52.h> sbit PpmP2^0; sbit UpP2^1; sbit DownP2^2; sbit Led_UpP2^3; sbit Led_DownP2^4; unsigned char k0; unsigned char a0; void Control() { if(Up0&am…

云原生网关的可观测性体系实践

作者&#xff1a;井轶 概述 可观测性一词来源于控制理论&#xff0c;是指系统可以由其外部输出推断其其内部状态的程度&#xff0c;随着 IT 行业几十年的发展&#xff0c;IT 系统的监控、告警、问题排查等领域的逐渐成熟&#xff0c;IT 行业也将其抽象形成了一整套可观测性工…

Linux基础学习记录

LInux学习 文章目录LInux学习1. Linux快捷键2. Shell基本命令”*“&#xff0c;”&#xff1f;“&#xff0c;”[]“&#xff1a;通配符pwd&#xff1a;显示当前目录cd&#xff1a;改变目录ls&#xff1a;列出目录内容cat和more&#xff1a;查看文本文件catmorehead和tail&…

为什么C语言需要指定平台开发?

前言&#xff1a; 笔者心血来潮&#xff0c;特意站在初学者角度去思考为什么C语言需要指定平台去开发呢&#xff1f; 物有本末&#xff0c;事有终始&#xff0c;知其先后&#xff0c;则近道矣。 语言历史&#xff1a; 读者应该能明白程序最底层无非就是01010101二进制被CPU给调…

(续)SSM整合之springmvc笔记(SpringMVC获取请求参数)(P131-135)

目录 一 通过ServletAPI获取 1 . 新建TestParamController类 2 . index.html 3 . 在TestParamController类里面写getParamByServletAPI 4. 测试 重新部暑 二 通过控制器方法的形参获取请求参数 1 . index.html 2 . TestParamController 3. 测试 三 RequestPar…

Vue2.0开发之——Vue基础用法-事件绑定$event(20)

一 概述 事件参数对象$event表示事件参数对象event事件修饰符 二 事件参数对象 2.1 说明 在原生的 DOM 事件绑定中&#xff0c;可以在事件处理函数的形参处&#xff0c;接收事件参数对象 event 2.2 示例 布局代码 <button v-on:click"addCount">1</bu…

高光谱解混和图片去噪(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…