List转树形结构的封装工具类
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Slf4j
public class DataTransferUtils {
public static <T> List<T> list2Tree(List<T> list,String idMethod,String parentMethod,String chirldMethod) {
List<T> trees=new ArrayList<>();
try {
for(T treeNode:list) {
if(Objects.isNull(getFieldValueByFieldName(parentMethod,treeNode))) {
trees.add(treeNode);
}
List<T> tList=new ArrayList<>();
for(T it:list) {
Object parentId=getFieldValueByFieldName(parentMethod,it);
Object id=getFieldValueByFieldName(idMethod,treeNode);
if(!Objects.isNull(parentId) && !Objects.isNull(id) && parentId.equals(id)) {
tList.add(it);
setValue(treeNode,treeNode.getClass(),chirldMethod,List.class,tList);
}
}
}
} catch (Exception e) {
log.error("数据转换异常:{}",e);
}
return trees;
}
public static Object getFieldValueByFieldName(String fieldName,Object object) {
try {
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
return field.get(object);
} catch (Exception e) {
log.error("根据属性名获取属性值异常",e);
return null;
}
}
public static void setValue(Object obj, Class<?> clazz, String filedName, Class<?> typeClass, Object value) {
filedName = removeLine(filedName);
String methodName = "set" + filedName.substring(0, 1).toUpperCase() + filedName.substring(1);
try {
Method method = clazz.getDeclaredMethod(methodName, new Class[] { typeClass });
method.invoke(obj, new Object[] { getClassTypeValue(typeClass, value) });
} catch (Exception ex) {
log.error("写入数据异常",ex);
}
}
private static Object getClassTypeValue(Class<?> typeClass, Object value) {
if (typeClass == int.class || value instanceof Integer) {
if (null == value) {
return 0;
}
return value;
} else if (typeClass == short.class) {
if (null == value) {
return 0;
}
return value;
} else if (typeClass == byte.class) {
if (null == value) {
return 0;
}
return value;
} else if (typeClass == double.class) {
if (null == value) {
return 0;
}
return value;
} else if (typeClass == long.class) {
if (null == value) {
return 0;
}
return value;
} else if (typeClass == String.class) {
if (null == value) {
return "";
}
return value;
} else if (typeClass == boolean.class) {
if (null == value) {
return true;
}
return value;
} else if (typeClass == BigDecimal.class) {
if (null == value) {
return new BigDecimal(0);
}
return new BigDecimal(value + "");
} else {
return typeClass.cast(value);
}
}
public static String removeLine(String str) {
if (null != str && str.contains("_")) {
int i = str.indexOf("_");
char ch = str.charAt(i + 1);
char newCh = (ch + "").substring(0, 1).toUpperCase().toCharArray()[0];
String newStr = str.replace(str.charAt(i + 1), newCh);
String newStr2 = newStr.replace("_", "");
return newStr2;
}
return str;
}