Использование Predicate при сравнении двух списков разного типа в Java

У меня есть два списка типа String и объект (рассмотрите сотрудника). Список строкового типа имеет коды сотрудников. Здесь мне нужно проверить, есть ли в списке сотрудников какой-либо объект кода (атрибут), сохраненный в String. Ниже мой класс сотрудников

public class Employee {
  public String code;
  public String id;
  // getters, setters and constructor
}

Здесь я могу узнать, есть ли у сотрудников код, сохраненный в заданном списке строк (employeeUserGrpCodes).

public static void main(String[] args) {

    final List<String> employeeUserGrpCodes= Arrays.asList("ABCWelcome","ABCPlatinum","SuperEmployee");

    List<Employee> empList=new ArrayList<Employee>();
    Employee k1= new Employee("KCAEmployee","1");
    Employee k2 = new Employee("ABCWelcome","2");

    empList.add(k1);
    empList.add(k2);

   List<Employee> empListN = empList.stream().filter(i->employeeUserGrpCodes.stream().anyMatch(j->j.equalsIgnoreCase(i.getCode()))).collect(Collectors.toList());
   List<String>newEmpList =  empList.stream().map(a->a.getCode()).collect(Collectors.toList()).stream().filter(employeeUserGrpCodes::contains).collect(Collectors.toList());
   if (!empListN.isEmpty() || !newEmpList.isEmpty())
    {
        System.out.println("Employee have employeeUserGrpCodes");
    }
}

В приведенном выше коде работают оба подхода: List 'empListN' и List 'newEmpList'. Можно ли сделать то же самое с помощью предикатов, которые я могу легко поместить в String 'anymatch', например

Predicate<Employee> isEmpUserGroup = e -> e.getCode().equalsIgnoreCase(employeeUserGrpCodes.stream())
boolean isRequiredEmployee = empList.stream().anyMatch(isEmpUserGroup);

1. collect(Collectors.toList()).stream() в вашем newEmpList избыточно. 2. существует тонкая разница между equalsIgnoreCase и contains, несмотря на отображение, которое будет очевидным, когда вы действительно имеете дело с вводом с учетом регистра. 3. Лямбда-выражение в вашей операции filter — это Predicate<T>, где T — тип потока, в вашем случае Employee. 4. все это можно было понять, перейдя к самому javadoc.

Naman 15.12.2020 03:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
1 796
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде всего, чтобы узнать, есть ли у Employee EmployeeUserGrpCodes, вам не нужны два списка, потому что empListN не пуст, newEmpList также не будет, поэтому мы можем использовать только два списка, а затем, связанные с использование предикатов, вы уже используете их в выражениях фильтра, у вас может быть что-то вроде этого для списка empListN:

Predicate<Employee> employeePredicate = e -> employeeUserGrpCodes.stream().anyMatch(c -> c.equalsIgnoreCase(e.getCode()));
List<Employee> empListN = empList.stream().filter(employeePredicate).collect(Collectors.toList());

Вы можете заметить, что Predicate также использует другой предикат.

c -> c.equalsIgnoreCase(e.getCode())

Таким образом, вы также можете заменить условие if и избежать использования временного списка, если вы проверяете свой предикат на соответствие списку сотрудников следующим образом:

if (empList.stream().anyMatch(employeePredicate)) {
    System.out.println("Employee have employeeUserGrpCodes");
}

Другие вопросы по теме