【问题标题】:How to get a List of objects having a particular property using Predicate如何使用 Predicate 获取具有特定属性的对象列表
【发布时间】:2022-06-11 00:21:26
【问题描述】:

我正在尝试使用 lambda 表达式查找所有薪水大于 50k 的员工。

但我无法访问getSalary() 方法。

ArrayList<emp> list=new ArrayList<>();
list.add(new emp("Ronaldo",1,90000,"UTD"));
list.add(new emp("Rooney",2,40000,"HOME"));

Predicate<ArrayList<emp>> p3 = (s) -> s.getSalary() > 50000;

System.out.println(p3.test(list));

【问题讨论】:

    标签: java list java-8 predicate


    【解决方案1】:

    试试这个!

    List<Employees> empGreaterThan = list.stream().filter(emp -> emp.getSalary() > 5000).collect(Collectors.toList());
    

    确保 getSalary() 已在您的 Employee 类中定义,或者您正在使用 Lombok 或类似插件来生成 Getter/setter!

    或者,如果你想定义自己的谓词,你可以这样做

    Predicate<Employee> myPredicate= emp -> emp.getSalary() > 5000;
    List<Employee> newList=  list.stream().filter(myPredicate).collect(Collectors.toList());
    

    【讨论】:

    • 实际上我的要求是只使用现有的谓词功能接口而不使用流来查找值。
    • 谓词的“test()”方法只会检查你传递给test()的参数是否落在谓词边界内!例如predicate.test(emp1) ,如果 emp1 的薪水 > 5000,那么它将返回 true !我建议你阅读 Java 文档
    【解决方案2】:

    Predicate 是一个函数式接口,JDK 内置,代表一个boolean-value 函数。

    它的方法test()返回truefalse是为了验证作为参数传递的对象是否符合条件。

    旁注:熟悉Java Naming conventionsemp - 这不是一个好名字。还有看看这个问题What does it mean to "program to an interface"?

    您对谓词的定义和用法不正确:

    (s) -> s.getSalary() > 50000
    

    参数sList&lt;Employee&gt; 类型,因此您不能在其上应用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);
    

    【讨论】:

      猜你喜欢
      • 2013-01-28
      • 2013-08-12
      • 1970-01-01
      • 2021-11-30
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 2011-01-17
      相关资源
      最近更新 更多