Java使用流去除集合中某个字段为空的对象

2023-11-07

0 写在前面

最近写了一些业务逻辑,调试的时候总会报空指针异常。
Java中空指针异常是危险恐怖分子,最好不要碰见他。所以有些时候,处理集合中的数据时,特定情况下需要略过一些数据。

1 情景复刻

前端传输参数,通过SpringBoot,使用MyBatis查询数据库数据。
此处我用伪代码复刻一下。(不代表真正得业务代码)

如果传输条件或者数据库其他表中的字段有错误的话,查询条件为null的话。则查出来的为空,此时java中就会报空指针异常。

	SELECT
	……
	FROM
	……
	WHERE 条件=null

2 解决方案

所以我们的解决办法:使用Java8的新特性(流)进行筛选。
把条件为空的数据给过滤掉,从那个集合中删除。
格式:

	集合 集合名称 =  集合.stream().filter(对象 -> 对象.get某个属性() != null).collect(Collectors.toList());

这句话的意思为:使用流的方式,将其中对象的某个属性为空的整条数据从集合中删除,构建一个新的集合。

代码复刻一下。
对象类


public class Person {
    private Integer id;
    private String name;
    private String sex;
    private String email;
    private Long phoneNumber;
    private String personUuid;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Long getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(Long phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getPersonUuid() {
        return personUuid;
    }

    public void setPersonUuid(String personUuid) {
        this.personUuid = personUuid;
    }

    public Person() {
    }

    public Person(Integer id, String name, String sex, String email, Long phoneNumber, String personUuid) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.email = email;
        this.phoneNumber = phoneNumber;
        this.personUuid = personUuid;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", email='" + email + '\'' +
                ", phoneNumber=" + phoneNumber +
                ", personUuid='" + personUuid + '\'' +
                '}';
    }
}


测试类



import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        //模拟数据--->其中person2中的uuid为null
        Person person1 = new Person(1,"孙悟空","男","zhangsan@163.com",18253847430L,"8BADB4E1-76B0-57F8-1C77-F25A1D06045D");
        Person person2 = new Person(2,"林黛玉","女","lindaiyu@126.com",18765381234L,null);
        Person person3= new Person(3,"鲁智深","男","luzhishen@qq.com",18254810416L,"A0576C79-CF82-879B-146B-1C0D172EC1A6");
        Person person4 = new Person(4,"貂蝉","女","diaochan@lvbu.com",12345678999L,"EC1EE903-FB4E-655D-B95B-2C41A0CAFD82");
        Person person5 = new Person(5,"猪八戒","女","zhubajie@lvbu.com",98765432111L,null);

        List<Person> personList = new ArrayList<Person>();

        personList.add(person1);
        personList.add(person2);
        personList.add(person3);
        personList.add(person4);
        personList.add(person5);
        //此时person2中的uuid为null。所以某些特定时段会报错。
        personList.forEach(person->{
            System.out.println(person);
        });

        //分割线
        System.out.println("--------------------------------------------------------");
        System.out.println("--------------------------------------------------------");
        System.out.println("--------------------------------------------------------");

        //处理数据
        List<Person> collect = personList.stream().filter(Person -> Person.getPersonUuid() != null).collect(Collectors.toList());

        collect.forEach(person -> {
            System.out.println(person);
        });
    }
}

	

输出结果:
在这里插入图片描述
可以看到,在集合中两个uuid为null的对象都被过滤出去了。

3 写在最后

此功能只是在特定情况下适用。
如果想要保留为null的数据,可以吧中见的判断条件改为对象 -> 对象.get属性 == null

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java使用流去除集合中某个字段为空的对象 的相关文章

  • 中断并标签,“标签 MyLabel 丢失”

    我有这样的代码 if condition1 break MyLabel while true some code here MyLabel if condition2 break more code here 我收到此错误 标签 MyLab
  • 在 portlet 中设置 SearchContainer 以使用 EL 和 JSTL 在 JSP 中使用它

    我正在尝试使用SearchContainer在我的liferay应用程序中 目前我必须使用 JSP Scriplets 来设置results in
  • 我在使用 JavaFX 绘制十字时遇到问题

    我正在尝试编写代码 在网格上对角绘制 3 个形状 前两个形状是正方形和圆形 我能做到 然而 第三种形状让我有些悲伤 我应该画一个十字 T 版本 而不是 X 每次我写出代码时 它看起来就像一个侧面 我知道我只是错过了一些简单的东西 但我真的很
  • Android:对于具有 LinearLayout 定义的成员的 ListView,上下文菜单不显示?

    我有一个 ListActivity 和 ListView 并且我已将一些数据绑定到它 数据显示得很好 而且我还为视图注册了一个上下文菜单 当我将列表项显示为简单的 TextView 时 它工作正常
  • Spring安全+LocaleResolver

    我需要在身份验证成功后更改区域设置 区域设置解析器
  • 模式更新后 jOOQ 生成的类的运行时验证?

    我用org jooq util DefaultGenerator在构建过程中生成 jOOQ 类来表示我的数据库模式 当应用程序运行时 架构预计会在应用程序不知情的情况下发生更改 此类更改可能与已生成的代码兼容 也可能不兼容 如何在运行时检测
  • Android:TelephonyManager 类

    我不明白为什么 API 文档中这么写TelephonyManager类是public 但是当我尝试创建一个实例时 它说它不是公共类 并且无法从包中访问 我看到它也说使用Context getSystemService Context TEL
  • Eclipse RCP - 将视图与编辑器区域堆叠?

    在开发 Eclipse RCP 应用程序时 是否可以将视图与编辑器区域堆叠在一起 像这样 我有多个列表 表格 我想创建一种预览组合 当通过单击鼠标选择列表上的项目时 我希望我的预览合成显示该项目的数据 如果用户双击某个项目 我想在预览合成后
  • 如何在 Java 中使用 HTML 解析器和 Apache Tika 来提取所有 HTML 标签?

    我下载了 tika core 和 tika parser 库 但找不到将 HTML 文档解析为字符串的示例代码 我必须删除网页源的所有 html 标签 我能做些什么 如何使用 Apache Tika 进行编码 您想要 html 文件的纯文本
  • Java 8 Stream - 并行执行 - 不同的结果 - 为什么?

    假设我有一个List
  • java中永远不会出现的异常

    我为点和向量编写一个类 我想用它们来计算向量的点和范数 这些是点类和向量类 public class Point public float x y public class MyVector public Point start end 我
  • 用于 Eclipse 的 Resharper [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Log4j 2.0 中发现 ClassNotFoundException

    我已经设置了 log4j12 api beta2 jar 的构建路径 但它给出了 以下错误请帮我解决这个问题我的代码如下 java 文件 package com sst log4j class Product private int pro
  • SQlite 获取最近的位置(带有纬度和经度)

    我的 SQLite 数据库中存储有纬度和经度的数据 我想获取距我输入的参数最近的位置 例如我当前的位置 纬度 经度等 我知道这在 MySQL 中是可能的 并且我已经做了相当多的研究 SQLite 需要一个自定义外部函数来实现半正弦公式 计算
  • Eclipse Juno 指标插件

    Eclipse JUNO 版本有哪些 Eclipse 指标插件 我尝试了一些通用指标插件 但没有一个能够在 Eclipse 的 JUNO 版本中正常运行 差点忘了 我们正在使用 Java 作为编程语言 我想要诸如圈复杂度 代码行数 方法长度
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • Android - 从渲染线程内结束活动

    下午好 我不熟悉 android 中的活动生命周期 并且一直在尽可能地阅读 但我不知道如何以良好的方式解决以下问题 我有一个使用 GLSurfaceView 的活动来在屏幕上绘制各种内容 在这个 GLSurfaceView 的渲染线程中 我
  • 背景图像隐藏其他组件,例如按钮标签等,反之亦然

    如何解决此代码中组件的隐藏问题 代码运行没有错误 但背景图片不显示 如何更改代码以获取背景图像 使用验证方法时 它在validation 中创建错误 public class TEST public TEST String strm Jan
  • java中什么是静态接口?

    我正在阅读Map Entry界面 当我注意到它是一个static界面 我不太明白什么是静态接口 它与常规接口有什么不同 public static interface Map Entry
  • Java有没有类似微软CHESS的工具?

    是否有类似于 Microsoft 的现有 Java 工具CHESS http research microsoft com chess 或者 CHESS 源代码是否开放 以便我可以尝试将其转换为 Java 谷歌的织线工 http code

随机推荐

  • Bug解决:ModuleNotFoundError: No module named ‘taming‘

    from taming modules vqvae quantize import VectorQuantizer2 as VectorQuantizer ModuleNotFoundError No module named taming
  • C++验证奇偶性时求余运算%和位运算&的速度比较

    假设验证数 m 的奇偶性 一般会想到直接用求余运算 即 m 2 用位运算也可以达到一样的效果 即 m 1 式子就是求二进制末尾的数是 0 还是 1 二者的运算都是奇数返回1 偶数返回0 但是最近遇到一道题 在验证的时候二者的运行速度差距比较
  • Jmeter 运行jmeter.bat报错errorLevel=1解决办法

    运行jmeter bat一闪而过 errorlever 1 可以看到生成的错误日志如下 内存不足 需要修改堆内存设置 There is insufficient memory for the Java Runtime Environment
  • linux查看java jdk安装路径和设置环境变量

    windows set java home 查看JDK安装路径 java version 查看JDK版本 linux whereis java which java java执行路径 echo JAVA HOME echo PATH 二 下
  • 【AutoML--模型搜索】论文阅读:Once-for-All: Train One Network and Specialize it for Efficient Deployment

    文章目录 1 论文概要 2 研究背景和动机 3 OFA的网络设计 3 1 Architecture Space 网络配置空间 3 2 训练 OFA 网络 3 2 1 Naive Approach 3 2 2 Progressive Shri
  • 【Jetson-Nano】1.基础安装环境配置

    文章目录 1 外观 2 Jetson Nano的规格 3 Jetson Noao 激活 4 安装系统包和prerequisites 4 1增加交换空间大小 4 2 ssh远程连接nano并设置最大功率 4 2 1 远程连接nano 4 2
  • NlogN复杂度寻找数组中两个数字和等于给定值

    算法导论 22页2 3 7 描述一个运行时间为O nlogn 的算法 找出n个元素的S数组中是否存在两个元素相加等于给定x值 AC解 a 1 3 6 7 9 15 29 def find2sumx nums x nums sort le r
  • 第三届字节跳动青训营——架构学习

    一 架构基础 架构定义 有关软件整体结构与组件的抽象描述 用于指导软件系统各个方面的设计 常见软件架构 单机 所有功能都实现在一个进程里 进程部署在单台机器上 运维时需要停服 C10K问题 Concurrent 10 000 Connect
  • npm常用命令

    查看npm版本 npm v 查看所有模块版本 npm version 搜索包 npm search 包名 安装包 i是install的缩写 npm i 包名 删除包 r是remove的缩写 npm r 包名 安装包并添加到依赖中 npm i
  • 计算机保护插件无法安装,电脑无法安装ActiveX控件怎么办

    ActiveX控件是网站常用的一款网页辅助工具 有时候我们可能需要安装它 但是却发现浏览器阻止了它安装 那么你知道电脑无法安装ActiveX控件怎么办吗 下面是学习啦小编整理的一些关于电脑无法安装ActiveX控件的相关资料 供你参考 电脑
  • flask中路由函数定义中遇到的问题

    flask的路由功能很强大 可以很清晰明了的定义出需要的路由函数 但是由于python语言的弱类型设计引来了一些不易发现的问题 app route task get methods GET def get tasks get the tas
  • python字符串转日期_使用Python将字符串转换为格式化的日期时间字符串

    我正在尝试将字符串 20091229050936 转换为 2009年12月29日 UTC gt gt gt import time gt gt gt s time strptime 20091229050936 Y m d H M S gt
  • python3 [爬虫入门实战]爬虫之scrapy爬取游天下南京短租房存mongodb

    总结 总的来说不是很难 只是提取的字段有些多 总共获取了一个120多个南京房租信息 1 爬取的item coding utf 8 Define here the models for your scraped items See docum
  • 《重构 - 改善既有代码的设计》总结

    1 重构 第一个示例 重构前 先检查自己是否有一套可靠的测试集 这些测试必须有自我验证能力 TDD 重构技术就是以微小的步伐修改程序 如果犯下错误 很容易便可发现它 傻瓜都能写出计算机可以理解的代码 唯有能写出人类容易理解的代码的 才是优秀
  • 元宇宙不是Web3

    个人对元宇宙的定义为 大规模 可互操作的网络 能够实时渲湘3D虚拟世界 借助大量连使性数据 如身份 历史 权利 对象 通信和支付等 可以让无限数量的用户体脸实时同步和持续有效的在场感 现在 你应该能理解我为何会给出这样的定义了 许多人可能会
  • 使用Junit进行单元测试超详细,这你还学不会?

    单元测试 从字面上来看就是对某一个功能单元进行测试 测试其功能是否正常 也就是说在给定的输入参数情况下 测试其结果的正确性 当这几天又重新温顾这一章节 我马上想起了前几天较劲脑静通过其测试用例的场景 一 介绍 1 Java中的最小功能单元是
  • react实现Modal弹窗

    一 Dialog js文件 import React useMemo useEffect useState from react import ReactDOM from react dom 需要把元素渲染到组件之外 用 createPor
  • git通过http的方式下载和提交代码

    之前一直用git的SSH方式下载代码 唯一的缺点可能就是需要建立SSH秘钥 需要额外生成一个密钥 然后在下载和提交代码的时候都需要输入秘钥 才能操作 时间长了可能就忘了密码 今天在做项目提交的时候就出现了这种情况 密码怎么试都不对 于是弃用
  • 理解不同加密币的要点(一)—— 共识机制

    一 加密货币分类 一 价值层面 与实体资产绑定的代币 为了因应市场需求而生 与实体资产做挂钩的代币 也就是我们说的稳定币 例如与美元做挂钩的USDT TUSD PAX与USDC等 仰赖网络共识的代币 代币价值仰赖网路上市场共识的代币 基本上
  • Java使用流去除集合中某个字段为空的对象

    文章目录 0 写在前面 1 情景复刻 2 解决方案 3 写在最后 0 写在前面 最近写了一些业务逻辑 调试的时候总会报空指针异常 Java中空指针异常是危险恐怖分子 最好不要碰见他 所以有些时候 处理集合中的数据时 特定情况下需要略过一些数