最近在给前端返回树形结构时,发现原来项目各有各的写法,于是写了一个工具类。
/**
* 转换为有树形结构的列表
* @param source 源数据所有数据
* @return
*/
public static List<TreeSelect> convert(List<TreeSelect> source) {
if (CollectionUtil.isEmpty(source)) {
return new ArrayList<>();
}
List<TreeSelect> result = new ArrayList<>();
List<String> idList = source.stream().map(TreeSelect::getId).collect(Collectors.toList());
// 设置最外层顶级
for (TreeSelect domainTreeSelectVO : source) {
// 判断所有列表里面父级未在集合中放置到一级
if (!idList.contains(domainTreeSelectVO.getPid())) {
result.add(domainTreeSelectVO);
}
}
for (TreeSelect domainTreeSelectVO : result) {
// 循环一级之后子级
getChildren(source, domainTreeSelectVO);
}
return result;
}
/**
* 循环设置子级
*
* @param list 所有元素列表
* @param treeSelectVO 父级元素
* @return 父级元素
*/
public static TreeSelect getChildren(List<TreeSelect> list, TreeSelect treeSelectVO) {
for (TreeSelect domainTreeSelectVO : list) {
if (treeSelectVO.getId().equals(domainTreeSelectVO.getPid())) {
List<TreeSelect> children = CollectionUtil.isEmpty(treeSelectVO.getChildren()) ? new ArrayList<>() : treeSelectVO.getChildren();
children.add(getChildren(list, domainTreeSelectVO));
treeSelectVO.setChildren(children);
}
}
return treeSelectVO;
}
树形对象:
@Data
public class TreeSelect implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 节点ID
*/
private String id;
/**
* 父节点ID
*/
private String pid;
/**
* 节点名称
*/
private String label;
/**
* 整个参数
*/
private Object data;
/**
* 子节点
*/
private List<TreeSelect> children;
}
后续只需每个业务将列表对象转换成参数所对应的列表对象即可