Hutool 工具类 TreeUtil 的使用

教程

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.1</version>
</dependency>


构建tree

// 构建node列表
List<TreeNode<String>> nodeList = CollUtil.newArrayList();
 
nodeList.add(new TreeNode<>("1", "0", "系统管理", 5));
nodeList.add(new TreeNode<>("11", "1", "用户管理", 222222));
nodeList.add(new TreeNode<>("111", "11", "用户添加", 0));
nodeList.add(new TreeNode<>("2", "0", "店铺管理", 1));
nodeList.add(new TreeNode<>("21", "2", "商品管理", 44));
nodeList.add(new TreeNode<>("221", "2", "商品管理2", 2));

TreeNode表示一个抽象的节点,也表示数据库中一行数据。 如果有其它数据,可以调用setExtra添加扩展字段

// 0表示最顶层的id是0
List<Tree<String>> treeList = TreeUtil.build(nodeList, "0");

因为两个Tree是平级的,再没有上层节点,因此为List


自定义字段名

//配置
TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
// 自定义属性名 都要默认值的
treeNodeConfig.setWeightKey("order");
treeNodeConfig.setIdKey("rid");
// 最大递归深度
treeNodeConfig.setDeep(3);
 
//转换器
List<Tree<String>> treeNodes = TreeUtil.build(nodeList, "0", treeNodeConfig,
        (treeNode, tree) -> {
            tree.setId(treeNode.getId());
            tree.setParentId(treeNode.getParentId());
            tree.setWeight(treeNode.getWeight());
            tree.setName(treeNode.getName());
            // 扩展属性 ...
            tree.putExtra("extraField", 666);
            tree.putExtra("other", new Object());
        });

通过TreeNodeConfig我们可以自定义节点的名称、关系节点id名称,这样就可以和不同的数据库做对应


使用实例

@Data
@NoArgsConstructor
@AllArgsConstructor
public class AClothClassVo {
    private Integer id;
    private String name;
    private Integer pid;
    private Integer status;
    private String desc;
    // 子目录列表
    private List<AClothClassVo> treeNode;
 
    public static void main(String[] args) {
        // 构建数据
        List<AClothClassVo> lists = CollUtil.newArrayList();
        lists.add(new AClothClassVo(1, "顶级目录1", 0, 1, "父目录01", null));
        lists.add(new AClothClassVo(2, "顶级目录2", 0, 1, "父目录02", null));
        lists.add(new AClothClassVo(3, "顶级目录3", 0, 1, "父目录03", null));
        lists.add(new AClothClassVo(4, "二级目录4", 1, 1, "父目录01的子类", null));
        lists.add(new AClothClassVo(5, "三级目录5", 4, 1, null, null));
        lists.add(new AClothClassVo(6, "四级目录6", 5, 1, null, null));
        lists.add(new AClothClassVo(7, "二级目录7", 2, 1, "父目录01的子类7", null));
        lists.add(new AClothClassVo(8, "二级目录8", 2, 1, "父目录01的子类8", null));
        lists.add(new AClothClassVo(9, "三级目录9", 4, 1, null, null));
 
        TreeNodeConfig config = new TreeNodeConfig();
 
        // 树形数据中id的属性名,写成id1方便区分,实际上写AClothClassVo实体类的id属性名
        config.setIdKey("id1");
 
        // 展示目录深度,数据中一共四级目录
        config.setDeep(2);
 
        /**
         * 入参
         * tree:  最终要返回的数据
         * node:  lists数据
         *
         * 返回
         * Tree<String>
         *   Tree: 转换的实体 为数据源里的对象类型
         *   String: ID类型
         *
         */
 
        List<Tree<String>> list = TreeUtil.build(lists, "0", config, (node, tree) -> {
            tree.setId(node.getId().toString());
            tree.setName(node.getName());
            tree.setParentId(node.getPid().toString());
 
            // 额外的值
            tree.put("status", node.getStatus());
            tree.put("desc", node.getDesc());
        });
 
        System.out.println(JSON.toJSONString(list));
    }
}

返回数据

[
    {
        "id1":"1",
        "name":"顶级目录1",
        "parentId":"0",
        "status":1,
        "desc":"父目录01",
        "children":[
            {
                "id1":"4",
                "name":"二级目录4",
                "parentId":"1",
                "status":1,
                "desc":"父目录01的子类"
            }
        ]
    },
    {
        "id1":"2",
        "name":"顶级目录2",
        "parentId":"0",
        "status":1,
        "desc":"父目录02",
        "children":[
            {
                "id1":"7",
                "name":"二级目录7",
                "parentId":"2",
                "status":1,
                "desc":"父目录01的子类7"
            },
            {
                "id1":"8",
                "name":"二级目录8",
                "parentId":"2",
                "status":1,
                "desc":"父目录01的子类8"
            }
        ]
    },
    {
        "id1":"3",
        "name":"顶级目录3",
        "parentId":"0",
        "status":1,
        "desc":"父目录03"
    }
]

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: hutool是一个Java工具类库,提供了丰富的工具类来方便Java开发人员快速开发,其中也包括了针对集合的工具类hutool集合工具类提供了丰富的API,包括对List、Queue、Stack、Map等集合数据结构的操作和处理。 其中,hutool提供的ListUtil工具类可以实现对List集合的排序、分页、去重等操作。QueueUtil和StackUtil工具类可以方便地对队列和栈进行push、pop等操作。MapUtil工具类则提供了map集合的常见操作,如put、get、remove等。 除了常见的集合类型,hutool还提供了TreeUtil工具类,可以方便的操作树型结构的集合数据。 hutool集合工具类的设计追求简洁易用,内部实现也采用了高效的算法。并且,hutool集合工具类的代码开源,易于修改和扩展。 综上,hutool集合工具类可以大大提高Java开发人员的开发效率和代码质量,是一款不可多得的Java工具库。 ### 回答2: hutool是一个Java工具包,其中包含了许多实用工具类。在其中,集合工具类对于Java程序员来说相当重要。 hutool中的集合工具类提供了简单、高效、易用的方法来操作集合对象。例如,可以使用ListUtil、SetUtil、MapUtil工具类对List、Set、Map等集合进行快速操作,如转换、去重、排序、过滤、判空等。 其中,集合转换是hutool集合工具类的常见用途之一,可以将一个集合类型转换成另一种集合类型,比如将List转换成Set或Map,还可以指定Key和Value的转换器,让转换更加灵活和自由。同时,hutool集合工具类还提供了快捷的创建空集合和不可变集合的方法,非常方便,也能避免空指针异常等问题。 另外,hutool集合工具类还具有比较高的通用性,可以应用在各类Java程序开发中,涵盖了Spring、Mybatis、Hibernate等框架,还比较适用于处理大数据量的集合操作。 总的来说,hutool集合工具类是一款非常实用的Java工具包,对于开发人员来说是不可或缺的。它简化了集合操作的流程,提高了代码的编写效率和可读性。如果你还没有使用hutool集合工具类,不妨尝试一下,它一定会给你的开发工作带来便利。 ### 回答3: Hutool是一个Java工具类库,它为Java开发人员提供了很多实用的工具类,其中就包括集合工具类Hutool集合工具类提供了一系列实用的方法,可以使Java开发人员更加便捷地操作集合,提升了开发效率。 Hutool集合工具类包含了对List、Set、Map等Java集合的操作。其中,对List操作的方法包括list转为数组、按照元素属性排序、去重、过滤等;对Set操作的方法包括set转为数组、去重、求交集、判断子集等;对Map操作的方法包括取最大值、取最小值、map转为List、根据value排序、根据value取key等。 Hutool集合工具类中也提供了一些特殊的数据结构,例如MultiValueMap,它可以将一个key对应多个value的情况存储在同一个Map中。同时,Hutool还提供了一些便捷的工具方法,例如采用Lambda表达式过滤集合、统计集合元素个数、集合元素分组等。 Hutool集合工具类使用非常简单,只需导入相应的工具类包,即可使用其中的方法。例如,使用ListUtil中的distinct方法去重List可以直接调用ListUtil.distinct(list)即可。另外,Hutool集合工具类中的方法都提供了详细的文档说明,使开发人员更容易理解和使用。 总之,Hutool集合工具类提供了很多实用的方法,可以帮助Java开发人员更加便捷地操作集合,提升开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值