[英]How do I get a distinct list of objects with JpaRepository.findAll using a 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()
返回true
或false
,它旨在驗證作為參數傳遞的對象是否與條件匹配。
旁注:熟悉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.