【发布时间】:2017-09-25 08:47:10
【问题描述】:
我有一个List<Map<String, Object>> 数据,我想应用一些按括号优先排序的逻辑条件列表。
示例条件类似于((firstname = john AND Lastname = Eleven) OR (salary = 15000 AND location = Mexico OR (firstname = mathew AND lastname = Thirteen)))
我想在List 上运行这些条件并只返回匹配的数据
我写了下面的代码,如果有人可以根据过滤器进行修改,那就太好了
package test;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
public class TestFilter {
public static void main(String argv[]) {
String[] firstnames = {"john", "david", "mathew", "john", "jerry", "Uffe", "Sekar", "Suresh", "Ramesh", "Raja"};
String[] secondnames = {"Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen", "Twenty"};
String[] salary = {"10000", "20000", "15000", "5323", "2000", "5346", "1000", "4889", "7854", "2438"};
String[] location = {"India", "Iceland", "Mexico", "Slovenia", "Poland", "Australia", "1000", "USA", "England", "Canada"};
List<Map<String, Object>> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("firstname", firstnames[i]);
dataMap.put("secondname", secondnames[i]);
dataMap.put("salary", salary[i]);
dataMap.put("location", location[i]);
list.add(dataMap);
}
String filterRule = "((firstname = john AND Lastname = Eleven) OR (salary = 15000 AND location = Mexico OR (firstname = mathew AND lastname = Thirteen)))";
System.out.println(filter(list, filterRule));
}
public static List<Map<String, Object>> filter(List<Map<String, Object>> list, String filterRules) {
List<Map<String, Object>> filtered = list.stream()
.filter(p -> checkFilter(p, filterRules)).collect(Collectors.toList());
return filtered;
}
public static Boolean checkFilter(Map<String, Object> mapData, String filterRules) {
// Apply condition here and return true or false
// return (mapData.get("firstname") + "").equalsIgnoreCase("john");
//return true;
}
}
【问题讨论】:
-
如果你想支持动态规则......你将不得不研究一些规则引擎,如 Drools 或至少一个规则表达式语法
-
我无法理解你想要达到的目标!
-
您希望退回什么类型的物品? ArrayList 可以吗?您是否从用户那里获取输入来指定过滤器?
-
@Yahya 在函数中,
List<Map<String, Object>>是返回类型 -
@SarveshKumarSingh 看起来很有希望,我会试一试,如果你有 java 中的示例程序,请告诉我
标签: java collections filter