Java Optional 实用判空实用实战,优雅永不过时

news2024/11/27 20:25:01

平时我们很多实体类里面会嵌套实体类,实体里面还嵌套实体。

那么我们有时为了取出最里面的实体的某个值的时候,我们就不得不一层层剥开这个 让人流泪的洋葱, 一层层判断。

举例(随便举的):

就像这么一个实体类,

学校信息统计类 SchoolSumInfo  ,里面包含    教师信息统计类 TeacherSumInfo  和 学生信息统计类 StudentSumInfo。

而教师信息统计类 TeacherSumInfo , 里面包含了 优秀教师信息统计类 ProminentTeacherSumInfo。

而优秀教师信息统计类ProminentTeacherSumInfo  ,里面包含了评选出来的一位 最佳教师  String mostManName, 还有全部优秀教师的姓名集合 List<String> names、总数 Integer count等。
 

 

 

 

那么来一个业务场景, 我们现在已经查询得到了 某个小学的 学校信息统计类,

我需要知道这里面的 最佳教师是谁?

如果没有,就如实说 ‘暂无’。


按照平常我们多半都是会去剥洋葱,写if 判空:

        SchoolSumInfo schoolSumInfo = getNullValueSchoolSumInfo();
        String mostManName = "暂无";
        if (Objects.nonNull(schoolSumInfo)) {
            TeacherSumInfo teacherSumInfo = schoolSumInfo.getTeacherSumInfo();
            if (Objects.nonNull(teacherSumInfo)) {
                ProminentTeacherSumInfo prominentTeacherSumInfo = teacherSumInfo.getProminentTeacherSumInfo();
                if (Objects.nonNull(prominentTeacherSumInfo)) {
                    if (StringUtils.isEmpty(prominentTeacherSumInfo.getMostManName())){
                        mostManName=prominentTeacherSumInfo.getMostManName();
                    }
                }
            }
        }
        System.out.println(" 获取结果: " + mostManName);

看那一层一层的if null 判断 : 

 

        
那么如果我们用 Optional  (Java 8 引入 ,主要是为了解决空指针异常NullPointerException)怎么把上面提到的业务场景判空取值代码给优雅呢?


来,首先我们写两个小函数,模拟一个是有值的,一个是没值的。

 


然后再看Optional玩法 :

噢,我的上帝,多么优雅的代码啊。 

        SchoolSumInfo schoolSumInfo = getNullValueSchoolSumInfo();
        String prominentTeaCount = Optional.of(schoolSumInfo)
                .map(SchoolSumInfo::getTeacherSumInfo)
                .map(TeacherSumInfo::getProminentTeacherSumInfo)
                .map(ProminentTeacherSumInfo::getMostManName)
                .orElse("暂无");
        System.out.println("getNullValueSchoolSumInfo 获取结果: " + prominentTeaCount);
        SchoolSumInfo schoolSumInfo1 = getHasValueSchoolSumInfo();
        String prominentTeaCount1 = Optional.of(schoolSumInfo1)
                .map(SchoolSumInfo::getTeacherSumInfo)
                .map(TeacherSumInfo::getProminentTeacherSumInfo)
                .map(ProminentTeacherSumInfo::getMostManName)
                .orElse("暂无");

        System.out.println("getHasValueSchoolSumInfo 获取结果:" + prominentTeaCount1);

看下返回结果,没值的填充了默认值 ‘ 暂无’ ,有值的返回了最佳教师 “JCccc” ,非常对: 

 

 

 

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

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

相关文章

关于迭代器遍历及auto关键词

在使用vector容器或者字符串时&#xff0c;很经常会用到一些遍历操作&#xff0c;除了使用下标遍历之外&#xff0c;使用迭代器遍历也是超级方便&#xff0c;但是迭代器也有有一些小坑&#xff0c;一不注意就会编译出错&#xff0c;所以特意总结一下。 迭代器 迭代器很很多接口…

性能测试之nginx监控系统搭建

不同tomcat服务器的负载均衡 在Nginx服务器192.168.43.138上安装Nginx&#xff0c;&#xff08;安装教程在前几篇文章有详细描述 &#xff09;实现反向代理tomcat负载均衡 执行一下命令&#xff0c;关闭防火墙 systemctl disable firewalld.service systemctl stop firewall…

[附源码]Node.js计算机毕业设计防疫科普微课堂Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

从外包被裁到拿到阿里Offer,多亏P8架构师的全套面试文档

引言 又是一年跳槽季&#xff0c;在疫情的影响下&#xff0c;今年的金三银四冷清不少。但无论如何&#xff0c;2020年招聘市场已经显示出了一个清晰的趋势&#xff0c;java开发岗面试越来越难&#xff0c;需求越来越少&#xff01;也更增加了游戏的“难度系数”。 跳槽时时刻刻…

99-数据结构与算法(上篇)

数据结构与算法数据结构和算法&#xff0c;一个非常古老的课题&#xff0c;工作的时候&#xff0c;一般只求程序能跑&#xff0c;并不太关注性能 一般情况下&#xff0c;我们尽量避坑&#xff0c;即避免这样&#xff1a;ArrayList Or LinkedList&#xff0c;哪个简单用哪个 实…

【Kubernetes】一主二从环境搭建,详细的图文描述

kubernetes&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本&#xff0c;于2014年9月发布第一个版本&#xff0c;2015年7月发布第一个正式版本。 kubernetes的本质是一组服务器集群&#xff0…

使用Java API操作HDFS

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录学习目标&#xff08;一&#xff09;了解HDFS Java API1、HDFS常见类与接口2、FileSystem的常用方法&#xff08;二&#xff09;编写Java程序访问HDFS1、创建Maven项…

Nacos 配置中心之长轮询--服务端

先回顾一下客户端和服务端交互的过程 服务端 入口 直接看长轮询的接口 ConfigController.listener PostMapping("/listener")Secured(action ActionTypes.READ, parser ConfigResourceParser.class)public void listener(HttpServletRequest request, HttpServ…

抓住三个关键因素,提高你的ASA广告效果!

​ 众所周知&#xff0c;App Store 作为 iOS 端的流量收口&#xff0c;旗下的 ASA 广告更是广告主在 iOS 生态投放广告的唯一渠道&#xff0c;所提供的四大广告位&#xff08;Today 标签、搜索标签、搜索结果和产品页面&#xff09;覆盖了用户访问的全路径&#xff0c;为广告主…

12月14日:跟着猫叔写代码api中的增删改查

首先在数据库中建立一个学生成绩信息表 DROP TABLE IF EXISTS bro_ceshiapi; CREATE TABLE bro_ceshiapi (id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT id,name varchar(100) DEFAULT NULL COMMENT 姓名,class varchar(100) DEFAULT NULL COMMENT 班级,score decima…

[附源码]Python计算机毕业设计Django基于vuejs的文创产品销售平台app

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

学习Vue3 - 认识 Reactive 全家桶

reactive 用来绑定复杂的数据类型&#xff0c;例如&#xff1a;对象、数组 reactive 源码约束了我们的类型 他是不可以绑定普通的数据类型的&#xff0c;这样是不允许的&#xff0c;会报错 因此&#xff0c;如果绑定普通的数据类型&#xff0c;可以使用ref ref绑定对象或者…

计算机SCI论文,如何写吸引人的摘要? - 易智编译EaseEditing

摘要简明扼要的概括全文的主要内容&#xff0c;是整篇文章的精华&#xff0c;是编辑、审稿专家以及读者阅读文章的最先关注的部分。 一个好的摘要可以正确反映文章内容&#xff0c;引起编辑、审稿专家以及读者的关注。那如何写出一个好的论文摘要呢&#xff0c;今天小易为大家…

一种基于摩斯密码的页面加密方法(web和小程序)

1. 开始 web开发中&#xff0c;常有一些功能仅希望对开发、测试人员等一小部分人展示&#xff0c;比如测试一个小程序项目中&#xff0c;想让测试人员快速复制当前对应的h5页面&#xff0c;这时候如果页面是必须登录的&#xff0c;我们可以借助vconsole&#xff0c;然后维护一…

redis之主从切换可能有哪些问题

写在前面 本文一起看下Redis cluster 集群模式下&#xff0c;发生了主从切换时可能存在的问题以及应对方案。 1&#xff1a;主从数据不一致 主从数据不一致&#xff0c;是由于主从同步延迟造成的&#xff0c;可能的解决方案如下&#xff1a; 1&#xff1a;尽量将主从同机房…

React面试:谈谈虚拟DOM,Diff算法与Key机制

1.虚拟dom 原生的JS DOM操作非常消耗性能&#xff0c;而React把真实原生JS DOM转换成了JavaScript对象。这就是虚拟Dom&#xff08;Virtual Dom&#xff09; 每次数据更新后&#xff0c;重新计算虚拟Dom&#xff0c;并和上一次生成的虚拟dom进行对比&#xff0c;对发生变化的…

Ansys Zemax | 用于数字投影光学中均匀照明的蝇眼阵列

简介 在数字投影仪设计中&#xff0c;我们希望确保数字光源与投影图像在辐照度分布相匹配。因此&#xff0c;这一约束要求投影仪设计包含均匀照明的空间光调制器——通常以LCD面板的形式呈现。理论上听起来很容易&#xff0c;但实际上&#xff0c;此面板上的光源光束通常是高斯…

语音输入转文字怎么操作?分享几种语音转文字技巧

相信有不少小伙伴在整理语音文件的时候&#xff0c;都会有过怎样把这些语音直接转换成文字的想法吧。每次在我开完会之后&#xff0c;需要对会议语音进行整理时&#xff0c;都会产生这种想法。因为我们需要不断的去听这个会议的语音内容&#xff0c;这样做既费时又费力。但其实…

MATLAB生成2D和3D格网(GUI程序)

目录 一、写函数DataStructure_Fnc 二、控件属性 三、生成2D格网代码 三、生成3D格网代码 一、写函数DataStructure_Fnc 函数代码&#xff0c;生成三角网需要调用此函数 function DataStructureDataStructure_Fnc(Table) [row col]size(Table); Table(1:end,5:7)-1; for j1…

【配置指导】如何配置dataFEED edgeConnector Siemens以实现西门子PLC与阿里云之间的双向通信

本配置指导手册介绍了如何配置dataFEED edgeConnector Siemens&#xff0c;以通过MQTT来将西门子S7-1200 PLC数据上传到阿里云&#xff1b;以及从阿里云发布数据&#xff0c;并传输到PLC中&#xff0c;从而实现西门子S7-1200 PLC与阿里云之间的双向通信。 主要内容包括&#xf…