1. 对比两个相同实体类的全部属性, 实体类:individual
List<Individual> individuals = new ArrayList<Indivdual>();
individuals.add(ind1);
individuals.add(ind2);
2. 以一个属性为例,假设这个属性是“姓名”,如果ind1,ind2两个实体“姓名”都有值,则获取ind1里的姓名;如果一个有值,一个空值,则获取有值的那个姓名; 有什么方法可以实现么
1、如果是要比较两个实体的全部属性是否都一样,可以在实体类里面重写equals方法
2、写个方法,if-else判断下就可以实现
可以使用反射机制获取属性和属性值,然后进行比较,最后赋值
public static void main(String[] args) {
User one = new User();
one.setId("1");
one.setName("张三");
User two = new User();
two.setMobile("12345678911");
User mergeUser = new User();
mergeObject(mergeUser, Lists.newArrayList(one, two));
System.out.println("id:" + mergeUser.getId() + " name:" + mergeUser.getName() + " mobile:" + mergeUser.getMobile());
}
private static void mergeObject(Object obj, List<Object> objectList) {
Method[] methods = obj.getClass().getMethods();
Map<String, List<Method>> propertyMethodListMap = Maps.newHashMap();
for (Method method : methods) {
if (!method.getName().startsWith("get") && !method.getName().startsWith("set")) {
continue;
}
String name = method.getName();
name = name.substring(3);
List<Method> methodList = propertyMethodListMap.get(name);
if (methodList == null) {
methodList = new ArrayList<>(2);
propertyMethodListMap.put(name, methodList);
}
methodList.add(method);
}
if (propertyMethodListMap.isEmpty()) {
return;
}
propertyMethodListMap.forEach((property, methodList) -> {
Method setMethod = null;
Method getMethod = null;
for (Method method : methodList) {
if (method.getName().startsWith("set")) {
setMethod = method;
} else {
getMethod = method;
}
}
if (setMethod == null || getMethod == null) {
return;
}
try {
setMethod.invoke(obj, Optional.ofNullable(getMethod.invoke(objectList.get(0))).orElse(getMethod.invoke(objectList.get(1))));
} catch (IllegalAccessException | InvocationTargetException e) {
}
});
}