# treeify-list-util **Repository Path**: syusukezhang/treeify-list-util ## Basic Information - **Project Name**: treeify-list-util - **Description**: Java List 转换成树 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-12-04 - **Last Updated**: 2021-12-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 列表转换树的工具类 ## maven dep ```xml me.yuxiaoyao.util.treeify treeify-list-util 1.0.0 ``` ## compile ``` mvn clean compile package install ``` ## usage ### API ``` /** * 转换成树的类(带深度) 默认起始深度为 0 * * @param sourceList 来源列表 * @param firstTest * @param cls * @param test * @param * @param * @return */ public static > List toTreeDepth(List sourceList, ITreeFirstTest firstTest, Class cls, ITreeParentTest test) /** * 转换成树的类(带深度) * * @param sourceList 来源列表 * @param firstTest 判断顶级结点的条件 * @param cls 返回的类型 * @param test 判断两个节点是否互为父子关系 * @param * @param * @return */ public static > List toTreeDepth(List sourceList, ITreeFirstTest firstTest, Class cls, ITreeParentTest test, ITreeMapper treeMapper, int firstDepth) ``` ### Demo com.digitalgd.portal.tree.TreeUtilTest ```java public class TreeUtilTest { private ObjectMapper objectMapper; @BeforeEach void setUp() { objectMapper = new ObjectMapper(); } private List mockData() { // pid == 0 是作为一级节点 List list = new ArrayList<>(); list.add(new QueryItem(1, 0, "ROOT1", null)); list.add(new QueryItem(2, 0, "ROOT1", null)); list.add(new QueryItem(3, 0, "ROOT1", null)); list.add(new QueryItem(4, 0, "ROOT1", null)); list.add(new QueryItem(5, 1, "ROOT1", null)); list.add(new QueryItem(6, 1, "ROOT1", null)); list.add(new QueryItem(7, 1, "ROOT1", null)); list.add(new QueryItem(8, 2, "ROOT1", null)); list.add(new QueryItem(9, 3, "ROOT1", null)); list.add(new QueryItem(10, 4, "ROOT1", null)); list.add(new QueryItem(11, 4, "ROOT1", null)); list.add(new QueryItem(12, 11, "ROOT1", null)); list.add(new QueryItem(13, 12, "ROOT1", null)); list.add(new QueryItem(14, 13, "ROOT1", null)); list.add(new QueryItem(15, 14, "ROOT1", null)); return list; } /** * 转换成树,没有深度 * * @throws JsonProcessingException */ @Test public void treeNoDepth() throws JsonProcessingException { List sourceList = mockData(); // TreeItem 必须实现 ITreeChildren List tree = TreeUtil.toTree(sourceList, // 原来的列表 node -> node.getPid() == 0, // 返回满足一级(顶级ROOT)节点的条件 TreeItem.class, // 转换成树的类 (parent, child) -> parent.getId().equals(child.getPid()) // 两个节点是否为父子节点的条件判断 ); // 默认赋值使用 BeanUtils.copyProperties(source,target); String s = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(tree); System.out.println(s); } /** * 转换成树,没有深度 * * @throws JsonProcessingException */ @Test public void treeCustomNoDepth() throws JsonProcessingException { List sourceList = mockData(); // TreeItem 必须实现 ITreeChildren List tree = TreeUtil.toTree(sourceList, // 原来的列表 node -> node.getPid() == 0, // 返回满足一级(顶级ROOT)节点的条件 TreeItem.class, // 转换成树的类 (parent, child) -> parent.getId().equals(child.getPid()), // 两个节点是否为父子节点的条件判断 (source, target) -> { // 自定义方式 把原来节点(source)的数据赋值到目标节点(target) target.setId(source.getId()); target.setName(source.getName()); target.setUrl(source.getUrl()); }); String s = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(tree); System.out.println(s); } /** * 默认转换器,树的深度起始为0 * * @throws JsonProcessingException */ @Test public void treeDepth() throws JsonProcessingException { List sourceList = mockData(); // TreeDepthItem 必须实现 ITreeDepthChildren List tree = TreeUtil.toTreeDepth(sourceList, // 原来的列表 node -> node.getPid() == 0, // 返回满足一级(顶级ROOT)节点的条件 TreeDepthItem.class, // 转换成树的类 (parent, child) -> parent.getId().equals(child.getPid()) // 两个节点是否为父子节点的条件判断 ); // 默认赋值使用 BeanUtils.copyProperties(source,target); String s = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(tree); System.out.println(s); } /** * 自定义转换器,树的深度起始为0 * * @throws JsonProcessingException */ @Test public void treeCustomDepth() throws JsonProcessingException { List sourceList = mockData(); // TreeDepthItem 必须实现 ITreeDepthChildren List tree = TreeUtil.toTreeDepth(sourceList, // 原来的列表 node -> node.getPid() == 0, // 返回满足一级(顶级ROOT)节点的条件 TreeDepthItem.class, // 转换成树的类 (parent, child) -> parent.getId().equals(child.getPid()),// 两个节点是否为父子节点的条件判断 (source, target) -> { // 自定义方式 把原来节点(source)的数据赋值到目标节点(target) target.setId(source.getId()); target.setName(source.getName()); target.setUrl(source.getUrl()); }); // 默认赋值使用 BeanUtils.copyProperties(source,target); String s = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(tree); System.out.println(s); } /** * 自定义转换器,树的深度起始为 10 * * @throws JsonProcessingException */ @Test public void treeCustomDepth10() throws JsonProcessingException { List sourceList = mockData(); // TreeDepthItem 必须实现 ITreeDepthChildren List tree = TreeUtil.toTreeDepth(sourceList, // 原来的列表 node -> node.getPid() == 0, // 返回满足一级(顶级ROOT)节点的条件 TreeDepthItem.class, // 转换成树的类 (parent, child) -> parent.getId().equals(child.getPid()),// 两个节点是否为父子节点的条件判断 (source, target) -> { // 自定义方式 把原来节点(source)的数据赋值到目标节点(target) target.setId(source.getId()); target.setName(source.getName()); target.setUrl(source.getUrl()); }, 10); // 默认赋值使用 BeanUtils.copyProperties(source,target); String s = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(tree); System.out.println(s); } } ```