public static void main(String[] args) throws IllegalAccessException {
List<PaperItemVo> paperItemVos = new ArrayList<>();
PaperItemVo paperItemVo = new PaperItemVo();
paperItemVo.setPaperName("营业执照");
PaperItemVo paperItemVo1 = new PaperItemVo();
paperItemVo1.setPaperName("营业执照");
paperItemVo1.setAgency("12321");
paperItemVo1.setAmount("234234");
PaperItemVo paperItemVo2 = new PaperItemVo();
paperItemVo2.setPaperName("营业执照");
paperItemVo2.setAgency("12321");
paperItemVo2.setAmount("234234");
paperItemVo2.setDiscipline("shjkdfhsdkjf");
paperItemVo2.setGrade("hsijfjsdk");
paperItemVos.add(paperItemVo);
paperItemVos.add(paperItemVo1);
paperItemVos.add(paperItemVo2);
Map<String, List<PaperItemVo>> groupByPaperName = paperItemVos.stream().collect(Collectors.groupingBy(PaperItemVo::getPaperName));
List<PaperItemVo> list = filterList(groupByPaperName, PaperItemVo.class);
list.forEach(System.out::println);
}
/**
* 根据实体类的某个属性去重,保留去重的实体类属性不为空最多的类
* 如果集合中的对象全是满属性,默认返回第一个
* @param groupByPaperName 已近通过某个属性分组的集合
* @param classType 类的字节码对象
* @param <T> 泛型
* @return 过滤后的集合
*/
public static <T> List<T> filterList(Map<String, List<T>> groupByPaperName, Class<T> classType) {
if (groupByPaperName == null || groupByPaperName.size() == 0){
return null;
}
List<T> filterList = new ArrayList<>();
Field[] fields = classType.getDeclaredFields();
int oldNotNullFieldNum = 0;
int thisNotNullFieldNum = 0;
for (String paperName : groupByPaperName.keySet()) {
List<T> paperItemVos = groupByPaperName.get(paperName);
T paperItemVo = paperItemVos.get(0);
for (Field field : fields) {
Object fieldValue = ReflectUtil.getFieldValue(paperItemVo, field);
if (Objects.nonNull(fieldValue)) {
oldNotNullFieldNum ++;
}
}
for (T itemVo : paperItemVos) {
for (Field field : fields) {
Object fieldValue = ReflectUtil.getFieldValue(itemVo, field);
if (Objects.nonNull(fieldValue)) {
thisNotNullFieldNum ++;
}
}
if (thisNotNullFieldNum > oldNotNullFieldNum) {
oldNotNullFieldNum = thisNotNullFieldNum;
paperItemVo = itemVo;
}
//重置
thisNotNullFieldNum = 0;
}
filterList.add(paperItemVo);
//重置
oldNotNullFieldNum = 0;
}
return filterList;
}
运行效果: