Reputation: 11163
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
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
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
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