场景:有三个List<Map>变量,分别为list1、list2、list3
List<Map<String,Object>> list1 = new ArrayList<>();
List<Map<String,Object>> list2 = new ArrayList<>();
List<Map<String,Object>> list3 = new ArrayList<>();
现在需要根据一个输入的字符"list1.column1=list2.column2,list1.column3=list3.column4"(不是固定的)来实现inner join关系的控制,即list1中的map和list2中map通过key值column1和column2关联,同时list1中的map和list3中map通过key值column3和column4关联。在sql中就是"select * from list1 inner join list2 on list1.column1=list2.column2 inner join list3 on list1.column3=list3.column4",将不同list中的map关联到一行上:
private static void test(){
long t0 = System.currentTimeMillis();
List<Map<String,Object>> list1 = new ArrayList<>();
List<Map<String,Object>> list2 = new ArrayList<>();
List<Map<String,Object>> list3 = new ArrayList<>();
//构造10万条数据
for (int i = 0; i < 100000; i++) {
String uuid = UUID.randomUUID().toString();
Map<String,Object> m1 = new HashMap<>();
m1.put("id1",i);
m1.put("value1", uuid.charAt(10)+uuid.charAt(12));
Map<String,Object> m2 = new HashMap<>();
m2.put("id2",i);
m2.put("value2", uuid.charAt(10)+uuid.charAt(1));
Map<String,Object> m3 = new HashMap<>();
m3.put("id3",i);
m3.put("value3", uuid.charAt(10)+uuid.charAt(12));
list1.add(m1);
list2.add(m2);
list3.add(m3);
}
long t1 = System.currentTimeMillis();
System.out.println("构造数据耗时:"+(t1-t0));
//添加关联条件
ArrayList<JoinRelation> joinRelations = new ArrayList<>();
joinRelations.add(new JoinRelation("list1.id1=list2.id2"));
joinRelations.add(new JoinRelation("list1.value1=list2.value2"));
joinRelations.add(new JoinRelation("list2.id2=list3.id3"));
joinRelations.add(new JoinRelation("list2.value2=list3.value3"));
InnerJoiner<Map<String,Object>> joiner = new InnerJoiner<>(joinRelations);
//字段逻辑
joiner.setGetter((o, columnName) -> MapUtils.getString(o,columnName,""));
long t11 = System.currentTimeMillis();
System.out.println("构造join对象耗时:"+(t11-t1));
//添加数据集
joiner.addUnit("list1",list1)
.addUnit("list2",list2)
.addUnit("list3",list3);
//进行关联操作
joiner.join();
DataKey key = new DataKey("list1");
//通过key拿到关联结果集,每个结果集数据条数一样
DataUnit<Map<String, Object>> result = joiner.getResult(key);
System.out.println("关联条数:"+result.size());
long t2 = System.currentTimeMillis();
System.out.println("关联耗时:"+(t2-t11));
//遍历其中一个数据集
for (Map<String, Object> map : result) {
//找到与该行关联的数据集,如果关联到多条,只会返回第一条
Map<DataKey, Map<String, Object>> row = joiner.findRow(map, key);
int i = 0;
}
long t3 = System.currentTimeMillis();
System.out.println("单行遍历查找耗时:"+(t3-t2));
}
测试效果:
总共10万条数据,通过关联条件得到6千条数据,遍历每一行拿到与之关联的数据总共耗时38秒,平均每次关联耗时6毫秒,后面有空会进行优化
源码链接:https://download.csdn.net/download/qq_36635569/87770897