在 Java 中使用 Predicate 比较两个不同类型的列表

Use of Predicate in comparing two list of different type in Java

我有两个 String 类型的列表和一个对象(考虑 Employee)。字符串类型列表有员工代码。在这里,我需要检查 Employee 列表是否有任何保存在 String 中的代码(属性)对象。下面是我的员工class

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'。是否可以在 Predicates 的帮助下做同样的事情,我可以很容易地将它放入 String 'anymatch' like

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

您可以注意到谓词也在使用另一个谓词

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

因此,如果您像这样针对员工列表测试谓词,您还可以替换 if 条件并避免使用临时列表:

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