使用Optional优雅地避免Java中获取属性时的空指针异常

使用Optional优雅地避免Java中获取属性时的空指针异常

  • 引言
  • 一、Optional简介
  • 二、应用场景与实例详解
  • 结论

引言

        在Java编程中,NullPointerException(空指针异常)是一个常见的运行时错误,尤其在访问对象的属性或调用方法时,如果对象本身为null,则会抛出此异常。自从Java 8引入了java.util.Optional类后,我们有了更安全、更简洁的方式来处理可能为null的对象引用,特别是在获取对象属性时。这里将通过几个实际应用场景,探讨如何利用Optional来避免获取属性时可能出现的空指针异常。

一、Optional简介

        Optional 是一个容器类,代表一个值存在或不存在。原来我们要检查一个对象是否为null,现在可以改为检查Optional对象是否有值。它可以帮助我们在设计API时明确表达某个值可能存在或者不存在,并在处理该值时提供了一种安全的方式。

二、应用场景与实例详解

  1. 简单属性获取

假设有一个Person类,其包含一个可为空的address属性:

public class Person {private String name;private Address address; // 可能为null// 省略getter和setter...
}

传统的做法可能是这样的:

Person person = ...; // 可能为null
String street = person.getAddress() != null ? person.getAddress().getStreet() : null;

使用Optional后,代码变得更加简洁且避免了空指针异常:

Person person = ...; // 可能为null
String street = Optional.ofNullable(person).map(Person::getAddress).map(Address::getStreet).orElse(null);
  1. 链式调用

        当需要连续获取多个层级的属性时,Optional的优势更为明显。例如,我们需要获取Person的City名:

public class Address {private String street;private City city; // 也可能为null// 省略getter和setter...
}public class City {private String name;// getter...
}

传统方式:

String cityName = person.getAddress() != null && person.getAddress().getCity() != null ? person.getAddress().getCity().getName() : null;

而使用Optional则可以避免嵌套的null检查:

String cityName = Optional.ofNullable(person).map(Person::getAddress).map(Address::getCity).map(City::getName).orElse(null);
  1. 集合中的属性获取

        对于集合中的对象属性获取,Optional也可以大显身手。比如从一个Person列表中获取所有人的street地址:

List<Person> people = ...; // 可能包含null元素List<String> streets = people.stream().map(Person::getAddress) // 返回Stream<Address>.filter(Objects::nonNull) // 过滤掉null.map(Address::getStreet) // 获取street.collect(Collectors.toList());

若改用Optional,可以一步到位:

List<String> streets = people.stream().map(Optional::ofNullable) // 将每个Person包装成Optional.flatMap(op -> op.map(Person::getAddress).map(Stream::of).orElseGet(Stream::empty)) // 平铺为Stream<Address>.filter(Objects::nonNull).map(Address::getStreet).collect(Collectors.toList());

结论

        Optional类为Java开发人员提供了一种更安全、更易于阅读的方式来处理潜在的null值。在获取对象属性时,通过合理使用Optional,我们可以有效避免因对象为空导致的空指针异常,同时使代码逻辑更加清晰,增强了代码的健壮性和可读性。然而,Optional并非银弹,过度或不恰当的使用反而可能导致代码复杂度增加,因此理解其适用场景并正确运用是关键所在。

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

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

相关文章

【无标题】spring中如何管理bean

在Spring框架中&#xff0c;Bean管理是指Spring容器如何创建、配置和管理应用程序中的对象&#xff08;称为Bean&#xff09;。Bean是Spring应用程序中的核心组件&#xff0c;它们是由Spring容器负责实例化、配置和管理的。Bean管理的核心思想是将应用程序的各个组件解耦&#…

企业级应用的安全性:常见漏洞及防护措施

在企业级应用中&#xff0c;保障安全性是至关重要的。企业系统的安全漏洞不仅可能导致重大的财务损失&#xff0c;还可能损害公司的声誉和客户信任。以下是一些常见的企业级应用漏洞及相应的防护措施&#xff1a; ### 常见漏洞 1. **SQL注入**&#xff1a; - 攻击者通过在…

【缓存常见问题】

在使用缓存时特别是在高并发场景下会遇到很多问题&#xff0c;常用的问题有缓存穿透、缓存击穿、缓存雪崩以及缓存一致性问题。 1、缓存穿透 首先&#xff0c;什么是缓存穿透呢&#xff1f; 缓存穿透是指请求一个不存在的数据&#xff0c;缓存层和数据库层都没有这个数据&…

虚拟天空解决方案,创造出令人惊叹的换天效果

在汽车视频领域&#xff0c;如何打破传统拍摄限制&#xff0c;呈现出更具创意和想象力的画面&#xff0c;成为众多企业和创作者追求的目标。美摄科技作为业界领先的视频技术提供商&#xff0c;凭借其强大的AI技术和三维渲染引擎&#xff0c;推出了全新的虚拟天空解决方案&#…

集成电路测试学习

集成电路&#xff08;Integrated Circuit&#xff0c;IC&#xff09;整个设计流程包括&#xff1a;电路设计、晶圆制造、晶圆测试、IC封装、封装后测试。 IC测试目的&#xff1a;一、确认芯片是否满足产品手册上定义的规范&#xff1b;二、通过测试测量&#xff0c;确认芯片可以…

李国武:QFD是如何将顾客需求转换为产品技术要求的?

如何将顾客的多样化需求精准地转化为产品的技术要求&#xff0c;成为企业赢得市场、提升竞争力的关键。质量功能展开&#xff08;Quality Function Deployment&#xff0c;简称QFD&#xff09;作为一种先进的质量管理工具&#xff0c;正是实现这一转换的有效桥梁。具体如天行健…

vim相关指令

vim的各种模式及其转换关系图 vim 默认处于命令模式&#xff01;&#xff01;&#xff01; 模式之间转换的指令 除【命令模式】之外&#xff0c;其它模式要切换到【命令模式】&#xff0c;只需要无脑 ESC 即可&#xff01;&#xff01;&#xff01; [ 命令模式 ] 切换至 [ 插…

【笔记】编写cmakelist的常用命令含义及使用

文章目录 命令projectfilesetconfigure_filelistadd_libraryset_target_propertiestarget_link_directoriestarget_link_librariestarget_compile_definitionsadd_subdirectoryfunction 持续更新 命令 project 用于定义一个项目&#xff0c;它是 CMakeLists.txt 文件中的第一个…

unity动画的关键帧添加event-同步语音

在iclone中做的语音嘴型动画&#xff0c;因是用下图自带的方式语音生成的动画&#xff0c;而不是用plugin(面捕live会连同语音一起导出)&#xff0c;所以导出来到Unity中&#xff0c;之后口型、动作、表情等没有声音。 我需要把原有的语音也重新在unity中加载上&#xff0c;原来…

解决WPS右键菜单冗余选项,去除WPS右键菜单选项

问题描述 安装WPS后&#xff0c;右键菜单会多出许多无用的选项&#xff0c;如何去除&#xff1f; 解决方法 按下WindowsS打开搜索栏&#xff0c;搜索配置工具打开 勾选所有的关闭和隐藏选项

汽车视频智能剪辑解决方案,满足用户对高品质汽车视频的追求

随着汽车智能化和互联网技术的快速发展&#xff0c;车载视频已经成为现代驾驶生活不可或缺的一部分。然而面对海量的行车视频&#xff0c;如何高效地剪辑、整理并分享这些精彩瞬间&#xff0c;一直是车主和汽车内容创作者们所面临的难题。美摄科技&#xff0c;作为领先的视频智…

Postgres数据库中的死锁是如何产生的,如何避免和解决?

文章目录 死锁的产生原因如何避免死锁如何解决死锁示例代码查询死锁信息终止事务 在Postgres数据库中&#xff0c;死锁是一种特殊的情况&#xff0c;其中两个或多个事务相互等待对方释放资源&#xff0c;从而导致它们都无法继续执行。这种情况通常发生在多个事务尝试以不同的顺…

rtpengine 的端点学习模式

端点学习模式&#xff08;endpoint-learning&#xff09; delayed|immediate|off|heuristic delayed 延迟模式&#xff0c;等待 3 秒钟&#xff0c;然后再提交到端点地址 immediate 立即模式&#xff0c;收到第一个 rtp 包之后立即学习&#xff0c;不等 3 秒 off 关闭模式…

【LeetCode】【0-1背包】目标和

题目链接&#xff1a;494. 目标和 - 力扣&#xff08;LeetCode&#xff09; 要在数组中通过加减元素得到目标和&#xff0c;记加的元素和为x&#xff0c;减的元素和为y&#xff0c;即x-ytarget 又因为xysum&#xff0c;两式相加&#xff0c;可以求得x&#xff08;targetsum&a…

SQL255 给出employees表中排名为奇数行的first_name

题目来源&#xff1a; 给出employees表中排名为奇数行的first_name_牛客题霸_牛客网 描述 对于employees表中&#xff0c;输出first_name排名(按first_name升序排序)为奇数的first_name CREATE TABLE employees ( emp_no int(11) NOT NULL, birth_date date NOT NULL, firs…

CSS transition和animation的用法和区别

Transition和Animation在CSS中都是用于实现元素状态变化的效果&#xff0c;但它们在用法和特性上存在明显的区别。 Transition transition是过度属性&#xff0c;主要强调的是元素状态的过渡效果。 它通常用于在元素的状态发生变化时&#xff0c;平滑地过渡到一个新的状态。…

高德地图API-鼠标点击地图获取经纬度坐标(关键操作)

效果图&#xff1a; 有了经纬度坐标&#xff0c;就可以得到城市的&#xff1a;adcode区域编码 html版本 <!doctype html> <html> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"&g…

瞪羚企业申报要求材料

申报企业还需提供以下材料&#xff0c;并依顺序装订成册。申报材料的内容一定要能够公开的&#xff0c;不会涉及到国家安全等机密信息。 1.“瞪羚企业”认定申请书&#xff1b; 2.企业营业执照复印件&#xff1b; 3.经审计的近三年的财务报告&#xff1b; 4.近3年企业所得税…

低配置的电脑上刷新WPF DataGrid 很卡,如何优化?

要优化低配置电脑上WPF DataGrid的刷新卡顿问题&#xff0c;可以尝试以下几种方法&#xff1a; 启用虚拟化技术&#xff1a; VirtualizingStackPanel.IsVirtualizing"True" 。 WPF DataGrid支持行虚拟化&#xff0c;这意味着只有当前可见的行会被加载和渲染&#xf…

HarmonyOS NEXT中怎么理解HAR、HAP、HSP、App的关系

文章目录 一、HAR1.1 简介1.2 使用场景1.3 约束限制 二、HAP2.1 简介2.2 使用场景2.3 约束限制 三、HSP3.1 简介3.2 使用场景3.3 约束限制 四、小结 一、HAR 1.1 简介 HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C库、资源和配置文件…