在使用lambda表达式

时间:2016-10-24 09:21:00

标签: java lambda java-8

我正在使用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");

3 个答案:

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