树型接口开发

treeList = TreeBuildUtils.build(knowledgeQueryVos, (menu, tree) -> {
                Tree<Long> menuTree = tree.setId(menu.getId())
                    .setParentId(menu.getParentId())
                    .setName(menu.getTopicName())
                    .setWeight(menu.getWeight());
                menuTree.put("level", menu.getLevel());
                menuTree.put("orderNum", menu.getOrderNum());
                Boolean addAllowed = menu.getAddAllowed();
                if(ObjectUtil.isEmpty(addAllowed)){
                    addAllowed = Boolean.FALSE;
                }
                menuTree.put("addAllowed", addAllowed);
            });

if (StrUtil.isNotEmpty(topicName)) {
                // 1. 筛选出所有符合条件的节点(任意级别)
                List<PublicServiceTopic> matchedNodes = knowledgeQueryVoList.stream()
                    .filter(node -> StrUtil.contains(node.getTopicName(), topicName))
                    .collect(Collectors.toList());

                // 2. 收集所有需要保留的节点ID(匹配的节点及其所有父节点)
                Set<Long> requiredIds = new HashSet<>();
                List<PublicServiceTopic> finalKnowledgeQueryVoList = knowledgeQueryVoList;
                matchedNodes.forEach(node -> collectParentIds(node, finalKnowledgeQueryVoList, requiredIds));

                // 3. 根据ID过滤出最终需要保留的节点
                knowledgeQueryVoList = knowledgeQueryVoList.stream()
                    .filter(node -> requiredIds.contains(node.getId()))
                    .collect(Collectors.toList());
            }

// 辅助方法:递归收集节点及其所有父节点的ID
    private void collectParentIds(PublicServiceTopic node,
                                  List<PublicServiceTopic> allNodes,
                                  Set<Long> collectedIds) {
        if (node == null || collectedIds.contains(node.getId())) {
            return;
        }

        // 收集当前节点ID
        collectedIds.add(node.getId());

        // 递归收集父节点ID
        Long parentId = node.getParentId();
        if (parentId != null) {
            PublicServiceTopic parent = findNodeById(allNodes, parentId);
            collectParentIds(parent, allNodes, collectedIds);
        }
    }

    // 辅助方法:根据ID查找节点
    private PublicServiceTopic findNodeById(List<PublicServiceTopic> nodes, Long id) {
        if (id == null || CollUtil.isEmpty(nodes)) {
            return null;
        }
        return nodes.stream()
            .filter(node -> id.equals(node.getId()))
            .findFirst()
            .orElse(null);
    }

  

posted @ 2025-07-16 10:44  全琪俊  阅读(10)  评论(0)    收藏  举报