Predicate 是一个函数式接口,JDK 内置,代表一个boolean-value 函数。
它的方法test()返回true或false是为了验证作为参数传递的对象是否符合条件。
旁注:熟悉Java Naming conventions、emp - 这不是一个好名字。还有看看这个问题What does it mean to "program to an interface"?
您对谓词的定义和用法不正确:
(s) -> s.getSalary() > 50000
参数s 是List<Employee> 类型,因此您不能在其上应用getSalary()。
而您期望p3.test(list) 会因此给出一个列表 也是错误的。谓词旨在产生 boolean 值,仅此而已。
相反,您需要遍历员工列表,并在迭代过程中对列表中的每个元素应用谓词。
最方便的方法是创建一个流(如 @Harsh 的答案所示)。您也可以使用普通的 for 循环来完成。
public static Predicate<Employee> salaryGraterThen(int salary) {
return emp -> emp.getSalary() > salary;
}
Predicate<Employee> salaryGraterThen50K = salaryGraterThen(50_000);
List<Employee> result = new ArrayList<>();
for (Employee emp: list) {
if (salaryGraterThen50K.test(emp)) result.add(emp);
}
也可以使用Collection 接口的removeIf() 方法来完成,该方法需要Predicate 作为参数,并将删除给定谓词 将被评估为的每个元素true.
为此,我们需要复制初始列表(以保持其完整):
List<Employee> result = new ArrayList<>(list);
result.removeIf(emp -> emp.getSalary() <= 50_000);