Administrator
发布于 2021-03-12 / 1535 阅读 / 0 评论 / 0 点赞

java动态设置List<实体类>属性值-多数据时高效率方法

java动态设置List<实体类>属性值-多数据时高效率方法

问题描述:30万个实体类集合,List size=30w 开始是用转Map的形式,速度极低,直接导致程序卡死,后换了一个方法。
有另个List动态存放实体类的属性名,如果这个集合中不存在List的属性,那么就需要将所有实体类的这个不存在的属性设置成其他值或者null。

1、思路

参考
Java 根据字段名称获取字段值, 根据字段名称设置字段值
java获取对象属性类型、属性名称、属性值

  • 首先获取实体类的所有属性,放进新的list中
public <T> List<String> getEntityProp(Class<T> clazz) {
        Field[] fields = clazz.getDeclaredFields();
        List<String> fieldNames = new ArrayList<>();
        for (Field field : fields) {
            fieldNames.add(field.getName());
        }
        fieldNames.remove("serialVersionUID");
        return fieldNames;
    }
  • 再与动态字典List对比,找出需要修改的属性
List<String> entityPropList = this.getEntityProp(clazz);
List<String> returnColumnList = 
			entityPropList.stream()
							.filter(item -> !columnList.contains(item))
							.collect(Collectors.toList());
  • 筛除的属性进行修改的方法
public static <T> void setValue(T t, List<String> fieldNames, Object value) {
        try {
            for (String fieldName : fieldNames) {
                Class<T> tClass = (Class<T>) t.getClass();
                Field declaredField = tClass.getDeclaredField(fieldName);
                declaredField.setAccessible(true);
                declaredField.set(t, value);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • 用java8parallelStream方法加快速度(经过测试比Stream快了近4倍左右)
entityList.parallelStream().peek(t -> setValue(t, returnColumnList, null)).collect(Collectors.toList());

2、完整代码

public <T> List<T> filterReportColumn(List<T> entityList, List<String> columnList, Class<T> clazz) {
        columnList.add("organizationCode");
        List<String> entityPropList = this.getEntityProp(clazz);
        List<String> returnColumnList = entityPropList.stream().filter(item -> !columnList.contains(item)).collect(Collectors.toList());

        return entityList.parallelStream().peek(t -> setValue(t, returnColumnList, null)).collect(Collectors.toList());
    }

    public <T> List<String> getEntityProp(Class<T> clazz) {
        Field[] fields = clazz.getDeclaredFields();
        List<String> fieldNames = new ArrayList<>();
        for (Field field : fields) {
            fieldNames.add(field.getName());
        }
        fieldNames.remove("serialVersionUID");
        return fieldNames;
    }

    public static <T> void setValue(T t, List<String> fieldNames, Object value) {
        try {
            for (String fieldName : fieldNames) {
                Class<T> tClass = (Class<T>) t.getClass();
                Field declaredField = tClass.getDeclaredField(fieldName);
                declaredField.setAccessible(true);
                declaredField.set(t, value);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

filterReportColumn是可供调用的方法
end


一键三连吧,点赞关注收藏吧
欢迎访问个人博客 水豚少年的博客小站


评论