如何使用Predicate筛选符合指定属性条件的对象列表
错误原因
代码存在两处核心问题,导致无法正常调用方法和完成筛选:
Predicate泛型绑定错误:声明的Predicate<ArrayList<emp>>表示判断入参是整个员工列表对象,ArrayList类本身没有定义getSalary()方法,该方法属于自定义员工类emp,因此编译阶段就会报错无法调用。- 筛选逻辑使用错误:
Predicate是用来校验单个对象是否满足匹配规则的函数式接口,不能直接传入集合完成批量筛选,要从集合中捞出所有符合条件的元素,需要配合Stream流的过滤方法使用。
修正方案
- 首先确认自定义的
emp类(Java编码规范建议类名使用大驼峰格式,可重命名为Emp)已经实现了getSalary()方法,否则无法读取实例的薪资属性。 - 将
Predicate的泛型类型改为单个员工类型emp,让lambda入参代表单个员工实例,此时即可正常调用getSalary()方法编写判断逻辑。 - 借助Stream流的
filter()方法传入Predicate规则,遍历集合筛选出所有符合条件的员工,最终收集为结果列表。
可运行完整代码
import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; // 员工实体类 class Emp { private String name; private int id; private int salary; private String dept; public Emp(String name, int id, int salary, String dept) { this.name = name; this.id = id; this.salary = salary; this.dept = dept; } // 必须提供getter方法才能访问私有属性salary public int getSalary() { return salary; } // 重写toString方便打印结果 @Override public String toString() { return "Emp{name='" + name + "', salary=" + salary + ", dept='" + dept + "'}"; } } public class EmpFilterTest { public static void main(String[] args) { ArrayList<Emp> list = new ArrayList<>(); list.add(new Emp("Ronaldo",1,90000,"UTD")); list.add(new Emp("Rooney",2,40000,"HOME")); // 正确声明Predicate:泛型为单个员工类型,判断单个员工薪资是否大于50k Predicate<Emp> highSalaryPredicate = emp -> emp.getSalary() > 50000; // 流式处理筛选符合条件的员工 List<Emp> highSalaryEmps = list.stream() .filter(highSalaryPredicate) .collect(Collectors.toList()); // 打印结果 System.out.println(highSalaryEmps); } }
运行结果
[Emp{name='Ronaldo', salary=90000, dept='UTD'}]
成功筛选出所有薪资大于50k的员工对象。
内容的提问来源于stack exchange,提问作者rajput
相关产品推荐
相关产品推荐

