相信大家在开发项目时都会遇到菜单(树形结构数据),为了便于前端显示,我们需要把数据整理成如下结构:
因为这样的需求每个项目中是很常见的,为了避免每次都需要循环整理,我写了一个通用的工具类,直接调用方法即可整理为如上数据。只要是树形结构的数据一般都能整理。
代码如下:
/**
* 转换为树形结构
* Created by ly on 2023/3/28.
*/
public class TreeUtils {
public static <T> List<T> generateTree(List<T> list, String id, String pid, String childs){
if(StringUtils.isBlank(id)||StringUtils.isBlank(pid)||StringUtils.isBlank(childs)){
return list;
}
ArrayList<T> resultList = new ArrayList<>();//最终结果集
HashMap<Object, T> objectMap = new HashMap<>();//临时数据集
if(!CollectionUtils.isEmpty(list)){
//整理数据
for (T t : list) {
//首先检查实体列childs是否初始化
Object childValue = TreeUtils.reflectGetFiledValue(t, childs);
if(childValue==null){
//认为集合未初始化
//初始化集合
TreeUtils.reflectSetFiledValue(t,childs,new ArrayList<>());
}
//反射获取主键
Object o = TreeUtils.reflectGetMethodValue(t, id);
objectMap.put(o,t);
}
//将结果转换为树形
if (!objectMap.isEmpty()){
for (Map.Entry<Object, T> objectTEntry : objectMap.entrySet()) {
T value = objectTEntry.getValue();
//反射获取父级id
Object pidKey = TreeUtils.reflectGetMethodValue(value, pid);
//将集合中的顶级放进结果集中
if(!objectMap.containsKey(pidKey)){
resultList.add(value);
}else{
//将子级数据归类(引用关系)
T parent = objectMap.get(pidKey);
//反射获取子级
Object childKey = TreeUtils.reflectGetMethodValue(parent, childs);
if(childKey instanceof List){
List temp = (List) childKey;
temp.add(value);
}
if(childKey instanceof Set){
Set temp = (Set) childKey;
temp.add(value);
}
}
}
}
}
return resultList;
}
/**
* 指定位置字母转换为大写
* create by ly on 2023/3/28
* @param [name]
* @return
*/
public static String strIndexUp(String name,int index){
String result = name;
if(StringUtils.isNotBlank(name)){
int length = name.length();
char[] str = new char[length];//结果集
int i = 0;
for (char c : name.toCharArray()) {
if(i == index){
//判断是否是字母
if(Character.isLetter(c)){
str[i] = String.valueOf(c).toUpperCase().toCharArray()[0];
}else{
str[i] = c;
}
}else{
str[i] = c;
}
i++;
}
result = String.valueOf(str);
}
return result;
}
简单使用:
//id指的是主键, pid是父级id,名称一定要和pojo中的属性名称一样
List<TsOnlineMenu> finalResult = TreeUtils.generateTree(list, "id", "pid", "childs");
有需要的可以联系我
您的赞和关注是对我创作的最大肯定谢谢大家