两个list中存放相同的对象,一个是页面导入,一个是从数据库查询,外部传入一个集合存放的是对象的属性名称,根据属性名称处理两个list
需求:两个list中存放相同的对象,一个是页面导入,一个是从数据库查询,外部传入一个集合存放的是对象的属性名称.要求根据传入的属性(多个)判断两个list中是否有重复的对象, 如果重复则删除数据库的list, 然后合并两个list.
/**
* 处理导入和数据库重复数据
* @param list
* @param listKey
* @return
*/
default List<T> processImportAndDatabaseDuplicateData(List<T> list, List<String> listKey) {
// 获取数据库中的全部数据
List<T> listEntityDatabase = this.list(null);
// 如果数据库中的数据与提交数据有重复则删除数据库的数据
listEntityDatabase.removeIf(obj2 -> list.stream().anyMatch(obj1 -> compareObjectsByProperties(obj1, obj2, listKey)));
list.addAll(listEntityDatabase);
return list;
}
default boolean compareObjectsByProperties(T n, T o, List<String> mappingTableKeys) {
return mappingTableKeys.stream().allMatch(propertyName -> {
Object value1 = getPropertyValue(n, propertyName);
Object value2 = getPropertyValue(o, propertyName);
return value1 != null && value1.equals(value2);
});
}
default Object getPropertyValue(T item, String propertyName) {
try {
return item.getClass().getDeclaredMethod("get" + capitalize(propertyName)).invoke(item);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
default String capitalize(String str) {
if (str == null || str.isEmpty()) {
return str;
}
return Character.toUpperCase(str.charAt(0)) + str.substring(1);
}