如何更好地检查流中的空值
List<Employee> employees1= employees.stream().filter(
employee -> students.stream()
.anyMatch(student ->
// checking null
employee!=null && student!=null &&
employee.getId()!=null && student.getName()!=null &&
employee.getId()==student.getId() &&
employee.getName().equals(student.getName()))
)
.collect(Collectors.toList());
我很好奇,看看您的代码NullPointerException
在执行过程中是否抛出。您正在流式传输employees
集合,然后是对象中的students
集合Employee
。
如果您的父对象Employee
值为空值,那么您就不能student
如内部流中所指示的那样对该对象进行收集。
考虑引入:
.map(employee -> Optional.ofNullable(employee)
.filter(Optional::isPresent)
.map(Optional::get)
在您的过滤器之前。这将消除任何空的父对象。
对于内部流,您似乎仍然担心您的student
元素将为null,因此在.anyMatch
调用之前重复这些行。
为了提高可读性,我将考虑将空检查提取到描述正在执行哪些检查的较小方法中。例如,您有一行:
employee.getName().equals(student.getName()
这表明您正在寻找员工姓名和学生姓名匹配的学生元素。employeeAndStudentNamesMatch(employee, student)
在这里就足够了。
为了检查空值,您应该真正使用Optional
API。这使您可以选择将可能为空的内容包装到安全包装中,以检查其中是否有值。从您要检查学生姓名是否存在的内部流中提取示例,可以将其替换为:
Optional.ofNullable(student.getName()).isPresent();
这就是我真正能提供的所有建议。希望它能帮助您进步。
可能我有两个对象Student,Employe,并且只查找那些具有相同名称和ID的对象,而不是来自数据库的受雇者和学生,这可能会使任何现场出租车都为空。
我建议更改数据库架构以禁止使用空值,尤其是在主键-id上。从长远来看,在数据库层实现这一点肯定会为您提供帮助,因此您不必手动检查Java中的结果。祝好运!:-)