1.测试类Test1
package com.common.core.utils;
import lombok.Data;
import java.util.Date;
@Data
public class Test1 {
private String userId;
private String userName;
private int age;
private String sex;
private String updateBy;
private Date updateTime;
}
2.测试类Test2
package com.common.core.utils;
import lombok.Data;
import java.util.Date;
@Data
public class Test2 {
private String userId;
private String userName;
private int age;
private String sex;
private String createBy;
private Date createTime;
private String updateBy;
private Date updateTime;
}
3.list合并工具类
package com.common.core.utils;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;
public class MergeUtils {
public static void main(String[] args) {
List<Test1> list = new ArrayList<>();
Test1 cUserInfoDO = new Test1();
cUserInfoDO.setUserId("123123");
cUserInfoDO.setUserName("阿萨德");
cUserInfoDO.setSex("男");
cUserInfoDO.setAge(1);
cUserInfoDO.setUpdateBy("张三");
cUserInfoDO.setUpdateTime(new Date());
list.add(cUserInfoDO);
List<Test2> list2 = new ArrayList<>();
Test2 cUserTspInfoDO = new Test2();
cUserTspInfoDO.setUserId("123123");
cUserTspInfoDO.setAge(1);
cUserTspInfoDO.setUserName("赵六");
cUserTspInfoDO.setSex("男");
cUserTspInfoDO.setCreateBy("李四");
cUserTspInfoDO.setCreateTime(new Date());
list2.add(cUserTspInfoDO);
//结果集
List<Test2> lists = mergeLists(list, list2, Test2.class, "userId", "userId");
System.out.println(lists);
}
/**
* 合并两个list对象 list1中的对象如果存在字段则不会合并
*
* @param list1 第一个list
* @param list2 第二个list
* @param clazz 返回对象
* @param para 对象中关联字段比如:list1中对象的userId,list2中对象的userId
* @param <C>
* @return
*/
public static <A, B, C> List<C> mergeLists(List<A> list1, List<B> list2, Class<C> clazz, String... para) {
//结果集
try {
List<Map<String, Object>> list3 = mergeMapList(listToMapList(list1), listToMapList(list2), para);
List<C> resList = mapListToList(list3, clazz);
return resList;
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
/**
* List<Map>结果合并
*
* @param list1
* @param list2
* @param para list1和list2的关联字段
* @return
*/
public static List<Map<String, Object>> mergeMapList(List<Map<String, Object>> list1, List<Map<String, Object>> list2, String... para) {
//使用stream流把list1和list2根据属性userId合并一个list集合
List<Map<String, Object>> resList = list1.stream().map(m1 -> {
list2.stream().filter(m2 ->
m1.get(para[0]).equals(m2.get(para[1]))
).forEach(m2 -> {
for (String key : m2.keySet()) {
if (m1.get(key) == null) {
m1.put(key, m2.get(key));
}
}
});
return m1;
}).collect(Collectors.toList());
System.out.println("数据拼接结果:" + resList.toString());
return resList;
}
/**
* List集合转List<Map<String, Object>>
*
* @param list
* @param <T>
* @return
*/
public static <T> List<Map<String, Object>> listToMapList(List<T> list) throws IllegalAccessException {
List<Map<String, Object>> resMapList = new ArrayList<>();
for (Object obj : list) {
resMapList.add(beanToMap(obj));
}
return resMapList;
}
/**
* map转list
*
* @param maps
* @param clazz
* @param <T>
* @return
*/
public static <T> List<T> mapListToList(List<Map<String, Object>> maps, Class<T> clazz) {
List<T> resList = new ArrayList<>(maps.size());
for (Map<String, Object> map : maps) {
try {
Object obj = mapToObject(map, clazz.newInstance());
resList.add((T) obj);
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
return resList;
}
/**
* 将Map转对象
*
* @param map
* @param <T>
* @return
*/
public static <T> T mapToObject(Map<String, Object> map, T t) {
Class<?> clazz = t.getClass();
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {//向上循环 遍历父类
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if ("serialVersionUID".equalsIgnoreCase(field.getName()))
continue;
if (map.containsKey(field.getName())) {
try {
field.set(t, map.get(field.getName()));
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
return t;
}
/**
* 将java对象转换为Map
*
* @param object
* @return
* @throws IllegalAccessException
*/
public static Map<String, Object> beanToMap(Object object) throws IllegalAccessException {
Map<String, Object> map = new HashMap();
Class<?> clazz = object.getClass();
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {//向上循环 遍历父类
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
map.put(field.getName(), field.get(object));
}
}
return map;
}
}