树型结构设计和实现菜单树(使用Java8 stream流处理)、list集合转换为String以分号隔开

树型结构设计和实现(菜单树)

一、数据库设计

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for tree
-- ----------------------------
DROP TABLE IF EXISTS `tree`;
CREATE TABLE `devices_tree`  (
  `node_id` bigint(32) NOT NULL COMMENT '节点Id',
  `parent_id` bigint(32) NOT NULL COMMENT '父节点ID',
  `node_name` varchar(32) COMMENT '节点名称',
  `node_type` int(2) COMMENT '节点类型',
  `create_time` varchar(32) COMMENT '创建时间',
  `remark` varchar(255) COMMENT '备注',
  PRIMARY KEY (`node_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '树型表' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

二、代码实现

在实体类加children字段

	/**
	 * 所有子分类
	 */
	@ApiModelProperty(value = "所有子分类")
	@JsonInclude(JsonInclude.Include.NON_EMPTY)
	@TableField(exist = false)
	private List<实体类> children;
public List<Tree> lisTree() {
		//1.查出所有分类
		List<实体类> entities = baseMapper.selectList(null);
		//组成父子树型结构
		List<实体类> collect = entities.stream().filter(tree ->
			tree.getParentId() == 0
		).map((menu) -> {
			menu.setChildren(getChildren(menu, entities));
			return menu;
		}).collect(Collectors.toList());

		return collect;
	}
/**
	 * 递归查找所有菜单的子菜单
	 *
	 * @param root 父菜单——当前菜单
	 * @param all  所用菜单——子菜单
	 * @return
	 */
private List<Tree> getChildren(实体类 root, List<实体类> all) {
  	List<实体类> children = all.stream().filter(tree -> {
    	return tree.getParentId().longValue() == root.nodeId().longValue();
  	}).map(entity -> {
    //1、找到子菜单
    entity.setChildren(getChildren(entity, all));
    return entity;
  	}).collect(Collectors.toList());
  	return children;
}

三、查找当前树下的 id数组

/**
	 * 获取当前id下的菜单id树
	 * @param id 入参id
	 * @return
	 */
	@Override
	public List<Long> knowledgeIdLongList(Long id) {
		List<Long> path = new ArrayList<>();
		path.add(id);
		List<Long> paths = this.findKnowledgeIdPath(id,path);
		//路径逆序
		//Collections.reverse(paths);

		return paths;
	}

	/**
	 * 获取当前 知识节点id下的所有id数组
	 * @param knowledgeId
	 * @param path
	 * @return
	 */
	private List<Long> findKnowledgeIdPath(Long id,List<Long> path) {
		//List<Long> path = new ArrayList<>();
		List<实体类> treeList = baseMapper.selectList(new QueryWrapper<实体类>().eq("parent_id", id));
		if (treeList != null && treeList.size()>0) {
			knowledgeTreeList.forEach(tree -> {
				path.add(tree.getId());
				this.findKnowledgeIdPath(tree.getId(),path);
			});
		}
		return path;
	}

在tree表中加一个字段,可解决这个循环遍历消耗内存和查询时间问题

  ancestors         varchar(50)     default ''                 comment '祖级列表',

四、list集合转换为String以分号隔开

//使用StringUtils.collectionToDelimitedString将list集合转换为String,以分号隔开
List<String> skuAttrValues;
String skuAttrValues = StringUtils.collectionToDelimitedString(skuAttrValues, ";");
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华婷深深

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值