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
。