#java #lambda #java-8
#java #лямбда #java-8
Вопрос:
Я работаю с java-8
. Пожалуйста, посмотрите следующий фрагмент кода —
studentsOfThisDept = students.stream()
.filter(s -> (student != null
amp;amp; s.getDepartment() != null
amp;amp; 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");
Ответ №1:
Введите переменную после фильтрации нулевых учащихся
studentsOfThisDept = students.stream()
.filter(s -> s != null)
.filter(s -> {
Dept dept = s.getDepartment();
return dept != null amp;amp; dept.getCode().equals("CS");
})
.collect(Collectors.toList());
filter()
принимает предикат, что означает, что лямбда-блок может выполнять такие действия, как объявление переменных, ведение журнала и т.д. Просто убедитесь, что возвращаете логическое значение в конце блока. Предикат — это функция, которая принимает объект и возвращает логическое значение.
Комментарии:
1. @Razib Да. Потому что Predicate — это функциональный интерфейс с абстрактным методом с сигнатурой
boolean test(T t)
. Это метод, который вы реализуете как лямбда. Итак, чтобы удовлетворить этот интерфейс, вы должны вернуть логическое значение. Смотрите docs.oracle.com/javase/8/docs/api/java/util/function /…
Ответ №2:
Альтернативой является
studentsOfThisDept = students.stream()
.filter(Objects::nonNull)
.filter(s -> Optional.ofNullable(s.getDepartment())
.map(Department::getCode).filter(c -> c.equals("CS")).isPresent()
)
.collect(Collectors.toList());
Ответ №3:
studentsOfThisDept = students.stream()
.filter(s -> {
if (s == null) return false;
Department dep = s.getDepartment();
return (dep != null amp;amp; dep.getCode().equals("CS")
);})
.collect(Collectors.toList());