温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - java stream null check
java stream

其他 - Java流空检查

发布于 2020-04-12 10:09:00

如何更好地检查流中的空值

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());

查看更多

提问者
Sagir
被浏览
61
NimbleNavigator 2020-03-19 17:46

我很好奇,看看您的代码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)在这里就足够了。

为了检查空值,您应该真正使用OptionalAPI。这使您可以选择将可能为空的内容包装到安全包装中,以检查其中是否有值。从您要检查学生姓名是否存在的内部流中提取示例,可以将其替换为:

Optional.ofNullable(student.getName()).isPresent();

这就是我真正能提供的所有建议。希望它能帮助您进步。