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

简介: 记录下如何在Java使用流去除集合中某个字段为空的对象

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

相关文章
|
5天前
|
存储 缓存 监控
Java面试题:在Java中,对象何时可以被垃圾回收?编程中,如何更好地做好垃圾回收处理?
Java面试题:在Java中,对象何时可以被垃圾回收?编程中,如何更好地做好垃圾回收处理?
16 0
|
6天前
|
存储 Java 索引
Java基础之集合
“【7月更文挑战第7天】”Java集合框架用于存放对象,包括List(如ArrayList、LinkedList、Vector)、Set(如HashSet、LinkedHashSet、TreeSet)和Queue(如PriorityQueue、ArrayDeque)。集合存放对象引用,基本类型自动转换为包装类。Collection是最基础接口,其子接口List、Set和Queue定义不同集合行为。Java提供抽象类和实现类简化开发,例如AbstractList、ArrayList、LinkedList等。集合通过Iterator遍历,也可用增强for循环。
35 11
|
5天前
|
存储 安全 Java
Java基础之集合Map
【7月更文挑战第8天】Java中的Map集合以键值对方式存储数据,如`Map&lt;&quot;name&quot;, &quot;张三&quot;&gt;`。Map接口定义了存取、判断、移除等操作,包括`put`、`get`、`containsKey`等方法。HashMap是最常用的实现,基于哈希表,允许null键值,但不保证顺序。其他实现包括同步的Hashtable、处理属性文件的Properties、保持插入顺序的LinkedHashMap、基于红黑树的TreeMap、弱引用的WeakHashMap、并发安全的ConcurrentHashMap和针对枚举优化的EnumMap。
11 4
|
5天前
|
安全 算法 Java
Java面试题:如何使用并发集合,例如ConcurrentHashMap?
Java面试题:如何使用并发集合,例如ConcurrentHashMap?
15 1
|
5天前
|
设计模式 缓存 安全
Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题
Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题
11 1
|
5天前
|
存储 缓存 算法
Java面试题:给出代码优化的常见策略,如减少对象创建、使用缓存等。
Java面试题:给出代码优化的常见策略,如减少对象创建、使用缓存等。
6 0
|
5天前
|
存储 安全 Java
Java面试题:请解释Java中的泛型集合框架?以及泛型的经典应用案例
Java面试题:请解释Java中的泛型集合框架?以及泛型的经典应用案例
10 0
|
5天前
|
设计模式 存储 缓存
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
9 0
|
5天前
|
安全 Java 开发者
Java多线程:Java中如何创建线程安全的集合,编程中如何优化Java多线程集合
Java多线程:Java中如何创建线程安全的集合,编程中如何优化Java多线程集合
16 0
|
6天前
|
Java
Java的对象监视器
摘要: Java中的监视器(Monitor)是线程同步机制,每个对象带有一个与之关联的监视器。线程通过`synchronized`获取和释放锁。监视器包含入口集(等待锁的线程)、所有者线程(持锁线程)和等待集(调用`wait()`的线程)。线程在入口集阻塞,等待集调用`wait()`后释放锁进入等待。线程状态包括新建、可运行、阻塞、等待、超时等待和终止。示例代码展示了线程如何在不同状态间转换,如线程获取和释放监视器锁以及调用`wait()`和`notify()`方法。