【发布时间】:2018-01-23 11:11:29
【问题描述】:
我有一个要求,我必须根据多个动态过滤条件从列表中过滤对象。
我已经编写了代码,通过循环遍历对象然后所有过滤器并在任何条件不匹配时返回 false。我写的代码是
Map<String, String> obj1 = new HashMap<>();
obj1.put("id", "1");
obj1.put("name", "name1");
obj1.put("dept", "IT");
obj1.put("sex", "M");
Map<String, String> obj2 = new HashMap<>();
obj2.put("id", "2");
obj2.put("name", "name2");
obj2.put("dept", "IT");
obj2.put("sex", "M");
Map<String, String> obj3 = new HashMap<>();
obj3.put("id", "3");
obj3.put("name", "name3");
obj3.put("dept", "DEV");
obj3.put("sex", "F");
ArrayList<Map<String, String>> employees = new ArrayList<>(Arrays.asList(obj1,obj2,obj3));
Map<String, String> filterCondition = new HashMap<>();
filterCondition.put("dept", "IT");
filterCondition.put("sex", "M");
List<Map<String, String>> filteredEmployee = new ArrayList<>();
for(Map<String,String> employee:employees){
if(isValid(filterCondition, employee)){
filteredEmployee.add(employee);
}
}
System.out.println(filteredEmployee);
isValid 方法为 as
private static boolean isValid(Map<String, String> filterCondition, Map<String, String> employee) {
for(Entry<String, String> filterEntry:filterCondition.entrySet()){
if(!employee.get(filterEntry.getKey()).equals(filterEntry.getValue())){
return false;
}
}
return true;
}
如果我得到的过滤器是动态的,有没有更好的方法来实现它。
我已经在 stackoverflow 中看到了一些答案为here,但没有任何帮助
【问题讨论】:
-
您使用的是 Java 8 吗?
-
我可以使用它。但即使使用流过滤器,我也无法比这更好地思考解决方案。
-
不是解决方案,但我会切换您的条件以避免潜在的 NPE:
if (!filterEntry.getValue().equals(employee.get(filterEntry.getKey()))) -
@DanW ,是的,我忘记添加了。实际上我正在使用 Apache StringUtils 进行字符串比较,它是空安全的。
-
@Roshan - 您可以将条件转换为单个谓词,然后使用 Stream.filter() - 请参阅我的答案。