簡體   English   中英

如何使用 Predicate 獲取具有特定屬性的對象列表

[英]How to get a List of objects having a particular property using Predicate

我正在嘗試使用 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));

嘗試這個!

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

確保在您的 Employee 類中定義了getSalary() ,或者您正在使用Lombok或類似的插件來生成 Getter/setter !

或者,如果你想定義自己的謂詞,你可以這樣做

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

Predicate是一個內置在 JDK 中的函數接口,表示一個boolean值函數。

它的方法test()返回truefalse ,它旨在驗證作為參數傳遞的對象是否與條件匹配。

旁注:熟悉Java 命名約定emp - 不是類的好名稱。 也看看這個問題“編程到接口”是什么意思?

您對謂詞的定義和用法不正確:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM