Class BeanTree<T,R extends Comparable<R>>

java.lang.Object
org.miaixz.bus.core.tree.BeanTree<T,R>
Type Parameters:
T - Bean类型
R - 主键、外键类型

public class BeanTree<T,R extends Comparable<R>> extends Object
本类是用于构建树的工具类,特点是采取lambda,以及满足指定类型的Bean进行树操作 Bean需要满足三个属性:
  • 包含不为null的主键(例如id)
  • 包含容许为null的关联外键(例如parentId)
  • 包含自身的子集,例如类型为List的children
本类的构建方法是通过BeanTree.of 进行构建,例如:
final BeanTree beanTree = BeanTree.of(JavaBean::getId, JavaBean::getParentId, null, JavaBean::getChildren, JavaBean::setChildren);
得到的BeanTree实例可以调用toTree方法,将集合转换为树,例如:
final List<JavaBean> javaBeanTree = beanTree.toTree(originJavaBeanList);
也可以将已有的树转换为集合,例如:
final List<JavaBean> javaBeanList = beanTree.flat(originJavaBeanTree);

最后,引用一句电影经典台词: 无处安放的双手,以及无处安放的灵魂。《Hello!树先生》

Since:
Java 17+
Author:
Kimi Liu
  • Method Details

    • of

      public static <T, R extends Comparable<R>> BeanTree<T,R> of(FunctionX<T,R> idGetter, FunctionX<T,R> pidGetter, R pidValue, FunctionX<T,List<T>> childrenGetter, BiConsumerX<T,List<T>> childrenSetter)
      构建BeanTree
      Type Parameters:
      T - Bean类型
      R - 主键、外键类型
      Parameters:
      idGetter - 主键getter,例如 JavaBean::getId
      pidGetter - 外键getter,例如 JavaBean::getParentId
      pidValue - 根节点的外键值,例如 null
      childrenGetter - 子集getter,例如 JavaBean::getChildren
      childrenSetter - 子集setter,例如 JavaBean::setChildren
      Returns:
      BeanTree
    • ofMatch

      public static <T, R extends Comparable<R>> BeanTree<T,R> ofMatch(FunctionX<T,R> idGetter, FunctionX<T,R> pidGetter, PredicateX<T> parentPredicate, FunctionX<T,List<T>> childrenGetter, BiConsumerX<T,List<T>> childrenSetter)
      构建BeanTree
      Type Parameters:
      T - Bean类型
      R - 主键、外键类型
      Parameters:
      idGetter - 主键getter,例如 JavaBean::getId
      pidGetter - 外键getter,例如 JavaBean::getParentId
      parentPredicate - 根节点判断条件,例如 o -> Objects.isNull(o.getParentId())
      childrenGetter - 子集getter,例如 JavaBean::getChildren
      childrenSetter - 子集setter,例如 JavaBean::setChildren
      Returns:
      BeanTree
    • toTree

      public List<T> toTree(List<T> list)
      将集合转换为树
      Parameters:
      list - 集合
      Returns:
      转换后的树
    • flat

      public List<T> flat(List<T> tree)
      将树扁平化为集合,相当于将树里的所有节点都放到一个集合里

      本方法会主动将节点的子集合字段置为null

      Parameters:
      tree - 树
      Returns:
      集合
    • filter

      public List<T> filter(List<T> tree, PredicateX<T> condition)
      树的过滤操作,本方法一般适用于寻找某人所在部门以及所有上级部门类似的逻辑 通过PredicateX指定的过滤规则,本节点或子节点满足过滤条件,则保留当前节点,否则抛弃节点及其子节点 即,一条路径上只要有一个节点符合条件,就保留整条路径上的节点
      Parameters:
      tree - 树
      condition - 节点过滤规则函数,只需处理本级节点本身即可,PredicateX.test(Object)true保留
      Returns:
      过滤后的树
    • forEach

      public List<T> forEach(List<T> tree, ConsumerX<T> action)
      树节点遍历操作
      Parameters:
      tree - 数
      action - 操作
      Returns: