Optional避免判空嵌套过多,优雅解决空指针异常

背景

最近在处理json文件反序列化为实体类的时候,抛出空指针异常,发现很多地方没有判空逻辑。
增加判空逻辑后,嵌套太多导致代码很臃肿,因此学习用Optional来进行优化代码,增加可读性。

Optional使用场景

1. map自动忽略空值,用于处理需要多次嵌套判空的场景

    // 需求1:获取某个产品的所有用户年龄。Product product = new Product();List<Integer> ages = new ArrayList<>();
// 原来的写法很冗余,不断地嵌套
//    List<User> users = product.getUsers();
//    if (!CollectionUtils.isEmpty(users)){
//      User user = users.get(0);
//      if (!Objects.isNull(user)){
//        Integer age = user.getAge();
//        if (age != null){
//          ages.add(age);
//        }
//      }
//    }
//    System.out.println(ages.toString());
//更优雅的写法Optional.ofNullable(product).map(a -> a.getUsers()).map(a -> a.get(0)).map(a -> a.getAge()).ifPresent(e->ages.add(e));System.out.println(ages.toString());

2.filter满足条件返回值,否则返回Optinal

    // 需求2:如果产品的版本包含1.0返回1.0,否则返回"高版本"。Product product = new Product(Arrays.asList(new User("zhangsan", 1)), "1.0");Optional<Product> product1 = Optional.ofNullable(product).filter(pro -> pro.getVersion() != null && pro.getVersion().contains("1.0"));// 满足条件后会返回第一个操作对象String s = product1.map(p -> p.getVersion()).orElse("高版本");//如果为空,或者不包含1.0返回"高版本"System.out.println(s);

总结

常用api

Optinal.ofNullable(Object)//新建optional对象
product1.map()//获取optional对象值,空值也不会报错
product1.filter()// 条件过滤,满足返回Optional对象,否则返回Optional<null>
orElse()//map中如果为空,直接跳到这一步返回默认值。经过这一步后都会将Optional包装的值取出来返回

参考文献

https://blog.csdn.net/weixin_42048560/article/details/86765903
https://blog.csdn.net/qq_43631716/article/details/107192503
https://blog.csdn.net/qq_35634181/article/details/101109300

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

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

相关文章

深入理解计算机系统 CSAPP 家庭作业7.12

A:refptr (unsigned)(ADDR(r.symbol) r.addend - refaddr) 0x4004f8 (-4) - 0x4004ea 0xa B:refaddr 0x4004d0 0xa 0x4004da refptr 0x400500 (-4) - 0x4004da 0x22 ​​​​​​​

Python24 机器学习之决策树

1.什么是机器学习&#xff1f; 机器学习是人工智能&#xff08;AI&#xff09;的一个分支&#xff0c;它使计算机系统能够从经验中学习并根据这些学习的数据做出决策或预测&#xff0c;而无需进行明确的编程。简而言之&#xff0c;机器学习涉及算法和统计模型的使用&#xff0…

Hugo Barra对Apple Vision Pro 硬件和软件的详细评述

原文&#xff1a;hugo.blog/2024/03/11/vision-pro 这篇文章的作者是Hugo Barra。Hugo Barra曾是Meta公司&#xff08;前身为Facebook&#xff09;旗下Oculus VR/AR团队的负责人。他在2017年至2020年期间领导了Oculus的团队&#xff0c;参与了多个VR头显的开发和发布。Hugo Bar…

使用提示词调教AI

“AI 是我们的数字员工&#xff0c;了解员工的秉性 &#xff0c; 从调教提示词开始。” 网上流传最广的提示词方法论&#xff0c;是“你需要给大模型一个角色”。这确实是一个好的策略&#xff0c;因为小学老师&#xff0c;大学老师这样的角色&#xff0c;预设很多背景信息。这…

【数学建模】 函数极值与规划模型

文章目录 函数极值与规划模型1. 线性代数和线性规划的联系1.1 线性代数的基本概念1.2 线性规划的基本概念1.3 线性代数与线性规划的联系矩阵和向量线性方程组单纯形法内点法凸优化 1.4 例子 2. Numpy有关矩阵运算示例2.1 矩阵的创建2.2 矩阵的基本运算2.3 矩阵的合并2.4 矩阵的…

如何在Java中实现WebSocket?

如何在Java中实现WebSocket&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Java中实现WebSocket&#xff0c;WebSocket是一种…

个人对JavaScript面向对象的见解

引言 在当今的软件开发领域&#xff0c;面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种非常流行的编程范式。它通过将现实世界中的对象模型化&#xff0c;使得软件开发更加接近人类看待世界的方式。面向对象编程提供了一种组织代…

Linux系统之nice命令的基本使用

Linux系统之nice命令的基本使用 一、nice命令介绍1.1 nice命令简介1.2 进程优先级介绍 二、nice命令基本语法2.1 nice命令的help帮助信息2.2 nice命令选项解释 三、nice命令的基本使用3.1 查看进程优先级3.2 使用nice启动进程3.3 提高优先级 四、注意事项 一、nice命令介绍 1.…

CentOS7环境Maxwell的安装及使用

目录 Maxwell的安装 下载安装包 解压安装包 配置环境变量 启用MySQL Binlog 创建Maxwell所需数据库和用户 配置Maxwell Maxwell的使用 启动Kafka集群 Maxwell启停 Maxwell启停脚本 MySQL数据准备 Kafka开启消费者 全量数据同步 增量数据同步 启动Kafka消费者 …

树链剖分及其应用

基本概念&#xff1a; 1.重儿子&#xff1a;假设节点u有n个子结点,其中以v子节点的为根子树的大小最大&#xff0c;那么v就是u的重儿子 2.轻儿子&#xff1a;除了重儿子以外的全部儿子都是轻儿子 3.轻边&#xff1a;结点u与轻儿子连接的边 4.重边&#xff1a;结点u与重儿子…

如何制作自己的网站

制作自己的网站可以帮助个人或组织在互联网上展示自己的品牌、作品、产品或服务。随着技术的发展&#xff0c;现在制作网站变得越来越简单。下面是一个简单的步骤指南&#xff0c;帮助你制作自己的网站。 1. 确定你的网站需求和目标 在开始之前&#xff0c;你需要明确你的网站的…

CSS Grid网格布局

一、前言 二、Grid布局 1、基本介绍 2、核心概念 &#xff08;1&#xff09;网格容器 &#xff08;2&#xff09;网格元素 &#xff08;3&#xff09;网格列 &#xff08;4&#xff09;网格行 &#xff08;5&#xff09;网格间距 &#xff08;6&#xff09;网格线 三…

基于PHP的酒店管理系统(改进版)

有需要请加文章底部Q哦 可远程调试 基于PHP的酒店管理系统(改进版) 一 介绍 此酒店管理系统(改进版)基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端jquery插件美化。系统角色分为用户和管理员。系统在原有基础上增加了注册登录注销功能&#xff0c;增加预订房间图片…

Spring Boot中如何集成GraphQL

Spring Boot中如何集成GraphQL 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot应用中集成GraphQL&#xff0c;这是一种强大的查…

Claude走向开放

Claude的愿景一直是创建能够与人们协同工作并显著提升他们工作流程的人工智能系统。朝着这一方向迈进&#xff0c;Claude.ai的专业版和团队版用户现在可以将他们的聊天组织到项目中&#xff0c;将精选的知识和聊天活动整合到一个地方&#xff0c;并且可以让团队成员查看他们与C…

DLMS/COSEM协议—(Green-Book)Wi-SUN profile

10.9 Wi-SUN profile&#xff08;Wireless Smart Utility Network&#xff09; 10.9.1 概述 (General) Wi-SUN FAN&#xff08;Field Area Network&#xff0c;现场区域网络&#xff09;旨在构建一个无处不在的网络&#xff0c;但它并没有指定特定的应用来在其上运行&#xf…

什么是期货基金?

期货基金&#xff0c;是指广大投资者将资金集中起来&#xff0c;委托给专业的期货投资机构&#xff0c;并通过商品交易顾问进行期货投资交易&#xff0c;投资者承担投资风险并享有投资利润的一种集合投资方式。期货基金的投资对象主要有两大类商品&#xff1a;期货与金融期货。…

django学习入门系列之第三点《案例 商品推荐部分》

文章目录 划分区域搭建骨架完整代码小结往期回顾 划分区域 搭建骨架 /*商品图片&#xff0c;父级设置*/ .slider .sd-img{display: block;width: 1226px;height: 460px; }<!-- 商品推荐部分 --> <!--搭建出一个骨架--> <div class"slider"><di…

提高开发效率之——工具介绍

一 . SerialDebug 串口调试工具 SerialDebug 是一个串口调试工具&#xff0c;它主要用于帮助电子工程师和软件开发者进行串口通信的调试工作。以下是 SerialDebug 工具的一些主要作用和特点: 基础串口通信功能&#xff1a;提供打开、关闭、接收、发送数据的基础串口操作。 数…

.NET C# 使用OpenCV实现人脸识别

.NET C# 使用OpenCV实现模型训练、人脸识别 码图~~~ 1 引入依赖 OpenCvSHarp4 - 4.10.0.20240616 OpenCvSHarp4.runtime.win - 4.10.0.20240616 2 人脸数据存储结构 runtime directory | face | {id}_{name} | *.jpg id - 不可重复 name - 人名 *.jpg - 人脸照片3 Demo 3.…