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