TreeHelper
# TreeHelper
# 此文档使用前置数据声明
originStudentList =
Steam.of(
Student.builder().id(1L).name("dromara").matchParent(true).build(),
Student.builder().id(2L).name("baomidou").matchParent(true).build(),
Student.builder().id(3L).name("hutool").parentId(1L).build(),
Student.builder().id(4L).name("sa-token").parentId(1L).build(),
Student.builder().id(5L).name("mybatis-plus").parentId(2L).build(),
Student.builder().id(6L).name("looly").parentId(3L).build(),
Student.builder().id(7L).name("click33").parentId(4L).build(),
Student.builder().id(8L).name("jobob").parentId(5L).build())
.toList();
originStudentTree =
asList(
Student.builder()
.id(1L)
.name("dromara")
.matchParent(true)
.children(
asList(
Student.builder()
.id(3L)
.name("hutool")
.parentId(1L)
.children(
singletonList(
Student.builder().id(6L).name("looly").parentId(3L).build()))
.build(),
Student.builder()
.id(4L)
.name("sa-token")
.parentId(1L)
.children(
singletonList(
Student.builder().id(7L).name("click33").parentId(4L).build()))
.build()))
.build(),
Student.builder()
.id(2L)
.name("baomidou")
.matchParent(true)
.children(
singletonList(
Student.builder()
.id(5L)
.name("mybatis-plus")
.parentId(2L)
.children(
singletonList(
Student.builder().id(8L).name("jobob").parentId(5L).build()))
.build()))
.build());
treeByLevelOriginStudentTree =
asList(
Student.builder()
.id(3L)
.name("hutool")
.parentId(1L)
.children(
singletonList(Student.builder().id(6L).name("looly").parentId(3L).build()))
.build(),
Student.builder()
.id(4L)
.name("sa-token")
.parentId(1L)
.children(
singletonList(Student.builder().id(7L).name("click33").parentId(4L).build()))
.build(),
Student.builder()
.id(5L)
.name("mybatis-plus")
.parentId(2L)
.children(
singletonList(Student.builder().id(8L).name("jobob").parentId(5L).build()))
.build());
treeFromRootToLevelOriginStudentTree =
asList(
Student.builder()
.id(1L)
.name("dromara")
.matchParent(true)
.children(
asList(
Student.builder().id(3L).name("hutool").parentId(1L).build(),
Student.builder().id(4L).name("sa-token").parentId(1L).build()))
.build(),
Student.builder()
.id(2L)
.name("baomidou")
.matchParent(true)
.children(
singletonList(
Student.builder().id(5L).name("mybatis-plus").parentId(2L).build()))
.build());
studentTreeHelper =
TreeHelper.of(
Student::getId, Student::getParentId, null, Student::getChildren, Student::setChildren);
}
// 实体对象
private static class Student {
private String name;
private Integer age;
private Long id;
private Long parentId;
private List<Student> children;
private Boolean matchParent;
@Tolerate
public Student() {
// this is an accessible parameterless constructor.
}
}
# 使用讲解
# of
构建树先生来帮我们操作
参数说明:节点id,父节点id,父节点id值,获取子节点,操作子节点
studentTreeHelper = TreeHelper.of(Student::getId, Student::getParentId, null, Student::getChildren, Student::setChildren);
通过以上操作可以构建我们的树先生出来帮助我们做一些操作了是不是操作很简单呢 接下来看一些树先生可以帮你做的事情
# toTree
传入List集合通过创建树先生时所传入信息去构造树结构
List<Student> studentTree = studentTreeHelper.toTree(originStudentList);
# toTree(构建层级)
传入List集合通过创建树先生时所传入信息去构造树结构,并且通过level控制构建的层级
List<Student> studentTree = conditionTreeHelper.toTree(originStudentList, 1);
# getTreeByLevel()
获取树的指定层级所有节点(包含子节点)
TreeHelper<Student, Long> conditionTreeHelper =
TreeHelper.ofMatch(
Student::getId,
Student::getParentId,
s -> Boolean.TRUE.equals(s.getMatchParent()),
Student::getChildren,
Student::setChildren);
// 结构相等
treeByLevelOriginStudentTree
conditionTreeHelper.getTreeByLevel(originStudentList, 2)
# cascadeSelect
通过树结构进行级联选择(类似于前端级联选择器功能) 用于从一组树的根节点中查找到指定节点ID的完整路径。如果在任一树中找到该路径,该方法将返回路径;如果没有找到,则返回空列表。
# 参数说明
- treeList: 树结构列表
- id: 节点ID
# 返回值
- 返回一个包含完整路径的列表,如果没有找到路径,则返回空列表
List<Student> studentTree = studentTreeHelper.toTree(originStudentList); // 转换树结构
Long targetStudentId = 6L;
List<Student> selectedPath = studentTreeHelper.cascadeSelect(studentTree, targetStudentId);
// selectedPath = [Student.builder().id(1L).name("dromara").matchParent(true).build(), Student.builder().id(3L).name("hutool").parentId(1L).build(), Student.builder().id(6L).name("looly").parentId(3L).build()]
# flat
将树结构进行扁平化
List<Student> studentList = studentTreeHelper.flat(originStudentTree);
# filter
根据给定的条件过滤列表中的元素,并且递归过滤子元素列表
List<Student> studentTree = studentTreeHelper.filter(originStudentTree, s -> "looly".equals(s.getName()));
/* 这样我们把包含这个果实的整个树枝都拿到了就,此时studentTree为 —>
Student.builder().id(1L).name("dromara").matchParent(true)
.children(singletonList(Student.builder().id(3L).name("hutool").parentId(1L)
.children(singletonList(Student.builder().id(6L).name("looly").parentId(3L).build()))
.build()))
.build())
*/
# forEach
对列表中的元素以及它们的子元素列表进行递归遍历,并在每个元素上执行给定的操作
List<Student> studentList = studentTreeHelper.forEach(originStudentTree, s -> s.setName("【open source】" + s.getName()));
# 测试用例地址
上次更新: 2024/04/25, 22:34:41