TreeUtil.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package com.simuwang.base.common.util;
  2. import cn.hutool.core.collection.ListUtil;
  3. import java.io.Serializable;
  4. import java.util.Comparator;
  5. import java.util.List;
  6. import java.util.function.BiConsumer;
  7. import java.util.function.Function;
  8. /**
  9. * @author wangzaijun
  10. * @date 2024/9/13 11:35
  11. * @description 集合转树工具
  12. */
  13. public class TreeUtil {
  14. /**
  15. * 集合对象转树结构,对象必须包含所需的树节点字段,不支持排序
  16. *
  17. * @param list 集合数据
  18. * @param getId 从对象T中获取id字段的方法
  19. * @param getParentId 从对象T中获取pid字段的方法
  20. * @param getChildren 从对象T中获取children字段的方法
  21. * @param setChildren 从对象T中设置children字段的方法
  22. * @param root 根节点的id值
  23. * @param <T> 对象类型
  24. * @return 转换后的树结构
  25. */
  26. public static <T> List<T> list2Tree(List<T> list,
  27. Function<T, Serializable> getId,
  28. Function<T, Serializable> getParentId,
  29. Function<T, List<T>> getChildren,
  30. BiConsumer<T, List<T>> setChildren,
  31. Object root) {
  32. return list2Tree(list, getId, getParentId, getChildren, setChildren, root, null);
  33. }
  34. /**
  35. * 集合对象转树结构,对象必须包含所需的树节点字段,支持排序
  36. *
  37. * @param list 集合数据
  38. * @param getId 从对象T中获取id字段的方法
  39. * @param getParentId 从对象T中获取pid字段的方法
  40. * @param getChildren 从对象T中获取children字段的方法
  41. * @param setChildren 从对象T中设置children字段的方法
  42. * @param root 根节点的id值
  43. * @param getOrder 排序方法
  44. * @param <T> 对象类型
  45. * @return 转换后的树结构
  46. */
  47. public static <T> List<T> list2Tree(List<T> list,
  48. Function<T, Serializable> getId,
  49. Function<T, Serializable> getParentId,
  50. Function<T, List<T>> getChildren,
  51. BiConsumer<T, List<T>> setChildren,
  52. Object root,
  53. Function<T, Comparable> getOrder) {
  54. List<T> treeList = ListUtil.list(false);
  55. for (T tree : list) {
  56. //check root
  57. if (objEquals(root, getParentId.apply(tree))) {
  58. treeList.add(tree);
  59. }
  60. //find tree's Children
  61. for (T treeNode : list) {
  62. if (objEquals(getId.apply(tree), getParentId.apply(treeNode))) {
  63. if (getChildren.apply(tree) == null) {
  64. setChildren.accept(tree, ListUtil.list(false));
  65. }
  66. getChildren.apply(tree).add(treeNode);
  67. }
  68. }
  69. if (getOrder != null) {
  70. List<T> childList = getChildren.apply(tree);
  71. if (childList != null && childList.size() > 1) {
  72. List<T> sortList = getSortList(childList, getOrder);
  73. setChildren.accept(tree, sortList);
  74. }
  75. }
  76. }
  77. if (getOrder != null && treeList.size() > 1) {
  78. treeList = getSortList(treeList, getOrder);
  79. }
  80. return treeList;
  81. }
  82. //对比对象是否相等
  83. public static boolean objEquals(Object a, Object b) {
  84. if (a == null)
  85. return b == null;
  86. return a.equals(b);
  87. }
  88. //list排序
  89. public static <T> List<T> getSortList(List<T> list, Function<T, Comparable> getOrder) {
  90. List<T> sortList = ListUtil.list(false);
  91. List<T> nullOrderList = ListUtil.list(false);
  92. for (T item : list) {
  93. if (null == getOrder.apply(item)) {
  94. nullOrderList.add(item);
  95. } else {
  96. sortList.add(item);
  97. }
  98. }
  99. sortList.sort(Comparator.comparing(getOrder::apply));
  100. sortList.addAll(nullOrderList);
  101. return sortList;
  102. }
  103. }