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);
}