Razib
Razib

Reputation: 11163

Storing some value in variable while using lambda expression

I am working with java-8. Please see the following code snippet -

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

Here I have to perform 2 check -

s.getDepartment() != null ; // 1st check

and

s.getDepartment().getCode().equals("CS") // 2nd check

Is there any way that I can store the value of s.getDepartment() to some variable (say dept) so that in second check I can write -

dept.getCode().equals("CS");

Upvotes: 4

Views: 1377

Answers (3)

Holger
Holger

Reputation: 298283

An alternative is

studentsOfThisDept = students.stream()
    .filter(Objects::nonNull)
    .filter(s -> Optional.ofNullable(s.getDepartment())
                         .map(Department::getCode).filter(c -> c.equals("CS")).isPresent()
           )
    .collect(Collectors.toList());

Upvotes: 5

kjsebastian
kjsebastian

Reputation: 1279

Introduce a variable after filtering null students

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

filter() takes a predicate, which means the lambda block can do things like declare variables, log stuff etc. Just make sure to return a boolean at the end of the block. A predicate is a function that takes an object and returns boolean.

Upvotes: 10

aviad
aviad

Reputation: 1573

studentsOfThisDept = students.stream()
            .filter(s -> {
                    if (s == null) return false;
                    Department dep = s.getDepartment();
                    return (dep != null && dep.getCode().equals("CS")
                    );})
            .collect(Collectors.toList()); 

Upvotes: 2

Related Questions