Сохранение некоторого значения в переменной при использовании лямбда-выражения

#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());