[英]How to filter a list of object by multiple fields in Java?
我想按多個字段過濾 object 列表,但這些用於過濾的字段可以更改。 例如;
假設我們有一個 Employee class 具有一些屬性:
@Data
public class Employee {
private Integer id;
private Integer age;
private String gender;
private String firstName;
private String lastName;
}
編寫有時按年齡和性別或有時僅按名字過濾的方法的最佳方法是什么? (可以復制樣本,即對於這個例子,它有 5 個屬性,所以有 5 個?= 120 種可能性) 是否可以使用 lambda 或 Java 中的其他內容對其進行編碼?
PS:任何可能性都沒有預定義。 無論請求來自什么,它都應該被它過濾。 我相信下面的例子會讓這個問題更清楚:
假設我們有一個過濾器 object,其屬性與 Employee 的相同。 如果給定了年齡並且其他是 null,則此服務將僅按年齡過濾。 或者只給出性別和名字,它應該按標准獲得員工。
如果您知道需要過濾的內容,則可以組合謂詞。 假設您要過濾名字以J
開頭、年齡超過 37 歲的員工。
Predicate<Employee> p = e -> e.getFirstName().startsWith("J");
p = p.and(e -> e.getAge() > 37);
您現在可以在過濾器中使用謂詞p
。 您只需要根據所需條件構建最終謂詞。
您可能想要使用filter
function。 這個 function 的工作方式是,如果您的表達式計算結果為真,它將返回到結果 stream。
一個示例片段是:
//Assuming employeeList is an ArrayList of Employee:
employeeList.stream().filter((e) -> e.age>25 && "M".equals(e.gender)); //Gives you a stream with all the male employees older than 25.
這里有一些閱讀材料給你。 特別是“2.3 For multiple condition”。 部分。
希望這可以幫助!
您可以為每個屬性實現某些搜索功能,例如
對於年齡,可能的過濾器'Equal'
、 'Greater than'
或'Less than'
對於姓氏,過濾器'is equal'
、 'begins with'
或'ends with'.
'is male'
您可以向您的員工 class 添加如下內容:
public static Predicate<Employee> ageEQ(int a) {
return e -> e.getAge() == a;
}
public static Predicate<Employee> ageGT(int a) {
return e -> e.getAge() > a;
}
public static Predicate<Employee> ageLT(int a) {
return e -> e.getAge() < a;
}
public static Predicate<Employee> isMale() {
return e -> e.getGender().equals("M");
}
public static Predicate<Employee> lastNameEQ(String name) {
return e -> e.getLastName().equals(name);
}
public static Predicate<Employee> lastNameStartsWith(String name) {
return e -> e.getLastName().startsWith(name);
}
並列出員工名單:
List<Employee> list = new ArrayList<>();
list.add(new Employee(1,22,"M","Aaa","Bar"));
list.add(new Employee(2,33,"F","Ccc","Ddd"));
list.add(new Employee(3,44,"M","Eee","Fff"));
list.add(new Employee(4,55,"F","Ggg","Hhh"));
list.add(new Employee(5,66,"F","Mmm","Nnn"));
例如,過濾所有 40 歲以上的女性員工:
list.stream()
.filter(Employee.ageGT(40).and(Employee.isMale().negate()))
.forEach(System.out::println);
假設您的請求類似於?age>40&male=false...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.