在使用lambda表达式时在变量中存储一些值

Raz*_*zib 4 java lambda java-8

我正在努力java-8.请参阅以下代码段 -

studentsOfThisDept = students.stream()
                .filter(s -> (student != null
                        && s.getDepartment() != null
                        && s.getDepartment().getCode().equals("CS")
                        ))
                .collect(Collectors.toList());  
Run Code Online (Sandbox Code Playgroud)

在这里我要进行2次检查 -

s.getDepartment() != null ; // 1st check
Run Code Online (Sandbox Code Playgroud)

s.getDepartment().getCode().equals("CS") // 2nd check
Run Code Online (Sandbox Code Playgroud)

有什么方法可以存储s.getDepartment()一些变量的值(比如说dept),这样在第二次检查时我可以写 -

dept.getCode().equals("CS");
Run Code Online (Sandbox Code Playgroud)

kjs*_*ian 10

过滤空学生后引入变量

studentsOfThisDept = students.stream()
            .filter(s -> s != null)
            .filter(s -> {
                     Dept dept = s.getDepartment();
                     return dept != null && dept.getCode().equals("CS");
                    })
            .collect(Collectors.toList());  
Run Code Online (Sandbox Code Playgroud)

filter()采用谓词,这意味着lambda块可以执行诸如声明变量,记录东西等操作.只需确保在块的末尾返回一个布尔值.谓词是一个接受对象并返回布尔值的函数.

  • @Razib是的.因为Predicate是一个带有签名`boolean test(T t)`的抽象方法的函数接口.这是您作为lambda实现的方法.因此,为了满足此接口,您必须返回一个布尔值.请参阅https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html (3认同)

Hol*_*ger 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());
Run Code Online (Sandbox Code Playgroud)