有关Java Stream流中存在null值问题

在 Java(8)开发 中,Stream API 提供了一种处理集合的强大方式,但在处理包含空值的流时,可能会遇到一些意想不到的问题。本文将通过一个简单的 User 实体类来演示如何处理空值,并讨论在实际开发中可能遇到的空指针异常(NullPointerException)。

1. 创建 User 实体类

首先,我们定义一个简单的 User 实体类,包含 nameagecountry 属性用于演示问题:

@Data
public class User {private String name;private Integer age;private String country;
}
    Stream<User> containsNullStream = Stream.of(new User("周润发", 18, "中国"), new User("亚索", 30, "小日子"), new User("贾冰", 49, "中国"), new User("周润发", 18, "中国"), null, null);log.info("nullStream的数量是:{}",containsNullStream.count());

通过数量检查是否元素全部添加进了流

运行结果
nullStream的数量是:6

修改代码,试图访问null对象的getName方法

    Stream<User> containsNullStream = Stream.of(new User("周润发", 18, "中国"), new User("亚索", 30, "小日子"), new User("贾冰", 49, "中国"), new User("周润发", 18, "中国"), null, null);containsNullStream.forEach(element -> log.info("element:{}", element.getName()));

由于我们访问了null值的属性,必定会导致空指针异常,如果我这么写,应该都能看出看来

Exception in thread "main" java.lang.NullPointerException

由以上可知,重复的null也是可以被Stream流逐一顺序存储。

为什么会这样?难道有人会这么写?还真有

在实际开发中,类似的情况是常见的。考虑以下代码段,从 Redis 缓存中获取对象并封装到集合中:

@Override
public CodeInfoCache fetchByCode(String code) {if (StrUtil.isBlank(code))return null;Object cachedObj = CustomRedisUtil.getRedisClient().opsForHash().get(RedisKeyConstant.CODE_CACHE_KEY, code);if (cachedObj != null)return fetchById(Long.valueOf(String.valueOf(cachedObj)));Code codeEntity = codeService.getOne(new QueryWrapper<Code>().eq(Code.CODE_FIELD, code));if (codeEntity == null)return null;return this.refreshSingleCache(codeEntity);
}
menuCodes.stream().map(code -> codeService.fetchByCode(code)) .forEach(codeInfoCache -> {// 在这里访问 codeInfoCache的成员方法});

在这里,如果 fetchByCode 方法返回 null,则在 forEach 中访问 codeInfoCache 的属性时将抛出空指针异常。这种情况在处理大量数据时尤其容易发生,可能导致整个逻辑失败。

5. 解决方案

为了避免空指针异常,可以在访问属性之前进行空值检查。可以使用 Optional 类来处理可能的 null 值,或者在 forEach 中添加条件判断:

menuCodes.stream().map(code -> codeService.fetchByCode(code)).filter(Objects::nonNull) // 过滤掉 null 值.forEach(codeInfoCache -> {// 安全访问 codeInfoCache 的成员方法log.info("Code Info: {}", codeInfoCache.getSomeProperty());});

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

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

相关文章

锐尔15注册机 锐尔文档扫描影像处理系统15功能介绍

锐尔文档扫描影像处理系统是一款全中文操作界面的文件、档案扫描及影像优化处理软件&#xff0c;是目前国内档案数字化行业里专业且优秀的影像优化处理软件。 无论是从纸质文件制作高质量的影像文件&#xff0c;或是检查已经制作好的影像文件&#xff0c;锐尔文档扫描影像处理…

如何设置路由器最大设备数量以及网速限制

设置路由器的最大设备数量和网速限制可以帮助你更好地管理家庭或办公网络&#xff0c;确保每个设备都能稳定地连接并合理分配带宽。以下是如何设置这两项功能的详细步骤&#xff1a; 一、设置路由器最大设备数量 大多数现代路由器都允许你设置最多能连接的设备数量&#xff0…

Unity DOTS系列之IJobChunk来迭代处理数据

最近DOTS发布了正式的版本, 我们来分享一下System中如何在System中使用IJobChunk来迭代处理World中的数据&#xff0c;方便大家上手学习掌握Unity DOTS开发。 再回顾一次基于ArcheType Chunk内存管理 我们先再次回顾以下基于ArcheType的Chunk内存管理。每一类Entity都是由一些…

【大语言模型_1】VLLM部署Qwen模型

1、模型下载&#xff1a; 魔塔社区&#xff1a;魔搭社区 huggingface&#xff1a;https://huggingface.co/Qwen 2、安装python环境 1、python官网安装python 【推荐要3.8以上版本】 2、安装vllm模块 3、启动模型 CUDA_VISIBLE_DEVICES0,1 /root/vendor/Python3.10.12/bin/pytho…

深度学习自编码器 - 预测稀疏分解(PSD)篇

序言 在数据科学与机器学习的广阔领域中&#xff0c;深度学习作为一股不可忽视的力量&#xff0c;正引领着技术革新的浪潮。其中&#xff0c;自编码器&#xff08; Autoencoder \text{Autoencoder} Autoencoder&#xff09;作为一种特殊的神经网络结构&#xff0c;以其独特的自…

大数据新视界 --大数据大厂之 Druid 实时数据分析平台在大数据中的应用

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

深入浅出:MySQL索引优化指南

一、引言 在数据库应用开发中&#xff0c;性能优化是一个永恒的话题。而索引作为提高数据库查询效率的关键手段&#xff0c;其设计和使用直接影响着系统的性能表现。本文将深入探讨MySQL索引的原理、类型以及优化策略&#xff0c;帮助读者更好地理解和应用索引&#xff0c;从而…

ListNode

ListNode 通常是在数据结构和算法中用到的一个类&#xff0c;它表示链表&#xff08;Linked List&#xff09;中的一个节点&#xff08;Node&#xff09;。在链表中&#xff0c;每个节点包含两个主要的部分&#xff1a;节点的数据&#xff08;值&#xff09;以及指向下一个节点…

充气模块方案——无刷充气泵pcba方案

在方案开发中&#xff0c;充气效率是无刷充气泵PCBA方案开发中的关键问题。一般通过优化电路设计和控制算法&#xff0c;可以实现高效的气体压缩和快速的充气效果。另外&#xff0c;选择合理的电机驱动器和传感器等元器件能够提高打气泵的功率和效率&#xff0c;减少充气时间&a…

在Windows系统上安装的 Arrow C++ 库

在Windows系统上安装的 Arrow C 库 正文第一步第二步第三步第四步注: 检查是否安装成功 吐槽 正文 第一步 git clone gitgithub.com:apache/arrow.git第二步 打开powershell (好像cmd也可以,不过我试了powershell中不报错,cmd中报错,不是很清楚为什么) 打开arrow的目录 cd …

贝锐洋葱头浏览器随时随地访问教务系统,轻松搞定选课

教育网的“拥堵”早已是老生常谈&#xff0c;学生数量庞大、上网时间集中、带宽有限&#xff0c;导致网络速度慢。尤其是从外部网络访问教育网时&#xff0c;更是因为跨运营商的缘故变得缓慢。 而学校内网也是类似的情况&#xff0c;课余时间和上课时间的网络使用情况差别巨大…

xpath在爬虫中的应用、xpath插件的安装及使用

安装 1、打开谷歌浏览器进入扩展程序安装页面(右上角会有"开发者模式按钮")默认是关闭的&#xff0c;当安装此插件时需要把开发者模式打开。 2、下载下来的xpath_helper是zip格式的&#xff0c;需要解压缩即可安装。 3、重启浏览器&#xff0c;再次点击扩展程序即…

C++八股进阶

之前那个只是总结了一下常考点&#xff0c;这个是纯手打记笔记加深理解 这里写目录标题 C的四种智能指针为什么要使用智能指针&#xff1f;四种智能指针&#xff1a; C中的内存分配情况C中的指针参数传递和引用参数传递C 中 const 和 static 关键字&#xff08;定义&#xff0…

NLP 序列标注任务核心梳理

句向量标注 用 bert 生成句向量用 lstm 或 bert 承接 bert 的输出&#xff0c;保证模型可以学习到内容的连续性。此时 lstm 输入形状为&#xff1a; pooled_output.unsqueeze(0) (1, num_sentence, vector_size) 应用场景 词性标注句法分析 文本加标点 相当于粗粒度的分词任…

watchEffect工作原理

watchEffect工作原理 自动依赖收集&#xff1a;watchEffect不需要明确指定要观察的响应式数据&#xff0c;它会自动收集回调函数中用到的所有响应式数据作为依赖。即时执行&#xff1a;watchEffect的回调函数会在组件的setup()函数执行时立即执行一次&#xff0c;以便能够立即…

(done) 声音信号处理基础知识(4) (Understanding Audio Signals for ML)

来源&#xff1a;https://www.youtube.com/watch?vdaB9naGBVv4 模拟信号特点如下 时域连续(x轴) 振幅连续(y轴) 如下是模拟信号的一个例子&#xff1a; 数字信号特点如下&#xff1a; 一个离散值序列 数据点的值域是一系列有限的值 ADC&#xff1a;模拟信号到数字信号的…

[leetcode]77_组合_给定数字范围且输出无重复

给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2&#xff1a; 输入&#xff1a;n 1, k 1 输出…

中间添加一条可以拖拽的分界线,来动态调整两个模块的宽度

在 React 中操作 DOM 元素时&#xff0c;使用 document.querySelector 以及全局事件监听&#xff08;如 addEventListener&#xff09;并不推荐&#xff0c;因为这些方法无法与 React 的生命周期很好地协调&#xff0c;可能会导致内存泄漏或影响性能。 可以改为使用 useRef 和…

【WRF运行第三期】服务器上运行WRF模型(官网案例-Hurricane Matthew)

【WRF运行第三期】运行WRF模型&#xff08;官网案例-Hurricane Matthew&#xff09; 官网案例-Hurricane Matthew介绍0 创建DATA文件夹1 WPS预处理1.1 解压GRIB数据&#xff08;ungrib.exe&#xff09;1.1.1 解压GRIB数据---GFS&#xff08;Matthew案例研究数据&#xff09;1.1…

Generic-eUICC-Test-Profile-for-Device-Testing-Public

通用eUICC测试配置文件-设备测试公开版 随着设备中不可移除UICC&#xff08;通用集成电路卡&#xff09;的引入&#xff0c;审查测试的最佳实践变得必要。传统上&#xff0c;行业认证计划如GCF和PTCRB的基于系统模拟器的设备测试期望通过可移除的测试UICC卡提供必要的测试配置…