我正在使用java-8
。请参阅以下代码段 -
studentsOfThisDept = students.stream()
.filter(s -> (student != null
&& s.getDepartment() != null
&& s.getDepartment().getCode().equals("CS")
))
.collect(Collectors.toList());
在这里,我必须进行2次检查 -
s.getDepartment() != null ; // 1st check
和
s.getDepartment().getCode().equals("CS") // 2nd check
有没有办法可以将s.getDepartment()
的值存储到某个变量(比如dept
),以便在第二次检查中我可以写 -
dept.getCode().equals("CS");
答案 0 :(得分:10)
过滤空学生后引入变量
studentsOfThisDept = students.stream()
.filter(s -> s != null)
.filter(s -> {
Dept dept = s.getDepartment();
return dept != null && dept.getCode().equals("CS");
})
.collect(Collectors.toList());
filter()
采用谓词,这意味着lambda块可以执行诸如声明变量,记录内容等操作。只需确保在块的末尾返回一个布尔值。谓词是一个接受对象并返回布尔值的函数。
答案 1 :(得分:5)
另一种选择是
studentsOfThisDept = students.stream()
.filter(Objects::nonNull)
.filter(s -> Optional.ofNullable(s.getDepartment())
.map(Department::getCode).filter(c -> c.equals("CS")).isPresent()
)
.collect(Collectors.toList());
答案 2 :(得分:2)
studentsOfThisDept = students.stream()
.filter(s -> {
if (s == null) return false;
Department dep = s.getDepartment();
return (dep != null && dep.getCode().equals("CS")
);})
.collect(Collectors.toList());