Java生成Tree数据格式工具
现在系统有很多模块需要tree格式的json,应次需求搞一个通用的工具,该暂时只适合有父子关系的对象。
一、定义ITree接口
public interface ITree<T> {
/**
* 获取id
*
* @return
*/
Integer getId();
/**
* 获取父id
*
* @return
*/
Integer getParentId();
/**
* 获取孩子
*
* @return
*/
List<T> getChildren();
/**
* 设置孩子
*
* @param children
*/
void setChildren(List<T> children);
}
二、继承ITree接口并实现方法
@Data
public class MenusVo implements ITree<MenusVo> {
/**
* 菜单名
*/
private Integer id;
/**
* 菜单名
*/
private String authName;
/**
* 访问路径
*/
private String path;
/**
* 父菜单id
*/
private Integer parentId;
/**
* 子菜单
*/
private List<MenusVo> children;
}
三、工具类编写
public class ConvertUtil {
private ConvertUtil() {
}
/**
* 集合转二叉树
*
* @param resource 来源集合
* @param predicate 根节点标识判断
* @return
*/
public static <T extends ITree> List<T> convertTree(List<T> resource, Predicate<? super T> predicate) {
List<T> result = resource.stream().filter(predicate).collect(Collectors.toList());
// 移出父级元素
resource.removeIf(result::contains);
ConvertUtil.setChilder(result, resource);
return result;
}
/**
* 设置孩子
*
* @param parentList 根节点集合
* @param elements 来源集合
* @param <T>
*/
private static <T extends ITree> void setChilder(List<T> parentList, List<T> elements) {
if (CollUtil.isEmpty(elements)) {
return;
}
// 遍历父级
parentList.forEach(parent -> {
List<T> childer = elements.stream().filter(element -> parent.getId().equals(element.getParentId())).collect(Collectors.toList());
parent.setChildren(childer);
elements.removeIf(childer::contains);
setChilder(childer, elements);
});
}
}
四、工具类调用
public ResponseEntity tree() {
List<MenusVo> menusList = ConvertUtil.convertList(menusService.list(null), MenusVo.class);
List<MenusVo> result = ConvertUtil.convertTree(menusList, menusVo -> 0 == menusVo.getParentId());
}