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();
}
}
- 用java8
parallelStream
方法加快速度(经过测试比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
一键三连吧,点赞关注收藏吧
欢迎访问个人博客 水豚少年的博客小站