在日常开发或工作需求中,我们需要构建菜单、树形结构,在数据库中使用父id进行标识。使得逻辑结构更加清晰。

前置准备:构建实体类

​
public class CategoryEntity implements Serializable {
	private static final long serialVersionUID = 1L;

	/**
	 * 分类id
	 */
	@TableId
	private Long catId;
	/**
	 * 分类名称
	 */
	private String name;
	/**
	 * 父分类id
	 */
	private Long parentCid;
	/**
	 * 层级
	 */
	private Integer catLevel;
	/**
	 * 是否显示[0-不显示,1显示]
	 */
	private Integer showStatus;
	/**
	 * 排序
	 */
	private Integer sort;
	/**
	 * 图标地址
	 */
	private String icon;
	/**
	 * 计量单位
	 */
	private String productUnit;
	/**
	 * 商品数量
	 */
	private Integer productCount;

​

stream流递归

使用stream流递归方式:在实体类上加入子菜单

/**
 * 子菜单
 */
@TableField(exist = false)
private List<CategoryEntity> categoryChilds;

还可以自定义排序等其他功能,可以自行完善

    @Override
    public List<CategoryEntity> listByTree2() {
        //先查询出所有
        List<CategoryEntity> alls = categoryDao.selectList(null);
        //查询出所有的父级菜单
        List<CategoryEntity> collect = alls.stream().filter(all -> all.getParentCid()==0)
                .map(categoryParent -> {
                    categoryParent.setCategoryChilds(getChilds(categoryParent, alls));
                    return categoryParent;
                }).collect(Collectors.toList());
        return collect;
    }

    private List<CategoryEntity> getChilds(CategoryEntity root, List<CategoryEntity> alls) {
        List<CategoryEntity> collect = alls.stream().filter(all -> {
            return all.getParentCid().equals(root.getCatId());
        }).map(categoryList -> {
            categoryList.setCategoryChilds(getChilds(categoryList, alls));
            return categoryList;
        }).collect(Collectors.toList());
        return collect;

    }

hutool工具包

使用Hutool工具包效率更高,但是需要掌握Stream流递归

 导入依赖

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

 

public List<Tree<Integer>> listByTree() {
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(simpleDateFormat.format(date));
        System.out.println(System.currentTimeMillis());
        List<CategoryEntity> entityList = categoryDao.selectList(null);
        TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
        treeNodeConfig.setIdKey("cid");
        treeNodeConfig.setNameKey("name");
        treeNodeConfig.setParentIdKey("parent_cid");
        treeNodeConfig.setDeep(3);
        List<Tree<Integer>> treeList = TreeUtil.build(entityList, 0, treeNodeConfig, (treeNode, tree) -> {
            tree.setId(treeNode.getCatId().intValue());
            tree.setName(treeNode.getName());
            tree.setParentId(treeNode.getParentCid().intValue());
            tree.putExtra("level", treeNode.getCatLevel());

        });
        Date date1 = new Date();
        SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(simpleDateFormat1.format(date1));
        System.out.println(System.currentTimeMillis());
        return treeList;
    }

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐