From a9e2a104cfb0994717b967608c7dea19f2f3e6e7 Mon Sep 17 00:00:00 2001 From: caihaohan Date: Tue, 20 Aug 2024 11:07:25 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E9=9B=B6=E9=83=A8=E4=BB=B6=E6=87=92?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/PartNameServiceImpl.java | 113 +++++++++--------- 1 file changed, 55 insertions(+), 58 deletions(-) diff --git a/laws-modules/src/main/java/com/jero/modules/laws/standard/service/impl/PartNameServiceImpl.java b/laws-modules/src/main/java/com/jero/modules/laws/standard/service/impl/PartNameServiceImpl.java index be338fc3..4f9eb955 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/standard/service/impl/PartNameServiceImpl.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/standard/service/impl/PartNameServiceImpl.java @@ -14,6 +14,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.stream.Collectors; @@ -192,12 +193,14 @@ public class PartNameServiceImpl extends ServiceImpl @Override public List queryList(String nodeName) { - // 查询所有节点 + // 查询所有节点并建立父节点映射 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); List allNodes = list(queryWrapper); + Map nodeMap = allNodes.stream() + .collect(Collectors.toMap(PartName::getCode, node -> node)); // 通过 nodeName 过滤符合条件的节点 - List matchedNodes = allNodes.stream() + List matchedNodes = allNodes.parallelStream() .filter(node -> node.getName() != null && node.getName().contains(nodeName)) .collect(Collectors.toList()); @@ -206,52 +209,47 @@ public class PartNameServiceImpl extends ServiceImpl } // 用于存储一级节点 - Set rootNodes = new HashSet<>(); + Set rootNodes = ConcurrentHashMap.newKeySet(); - // 查找每个匹配节点的一级父节点 - for (PartName matchedNode : matchedNodes) { + // 并行查找每个匹配节点的一级父节点 + matchedNodes.parallelStream().forEach(matchedNode -> { PartName currentNode = matchedNode; - while (currentNode != null && !currentNode.getParentCode().equals("Part")) { - // 查找当前节点的父节点 - String parentCode = currentNode.getParentCode(); - currentNode = allNodes.stream() - .filter(node -> node.getCode().equals(parentCode)) - .findFirst() - .orElse(null); + while (currentNode != null && !"Part".equals(currentNode.getParentCode())) { + currentNode = nodeMap.get(currentNode.getParentCode()); } - // 添加一级节点到结果集 if (currentNode != null) { rootNodes.add(currentNode); } - } + }); - // 设置叶子标志的逻辑调整 - for (PartName node : rootNodes) { - Set descendantCodes = getAllDescendantCodes(node.getCode(), allNodes); // 获取所有子孙节点的ID - boolean isLeaf = true; // 默认设置为叶子节点 + // 并行设置叶子标志 + rootNodes.parallelStream().forEach(node -> { + Set descendantCodes = getAllDescendantCodes(node.getCode(), nodeMap); + boolean isLeaf = matchedNodes.stream() + .noneMatch(matchedNode -> descendantCodes.contains(matchedNode.getCode())); + node.setLeafFlag(isLeaf); + }); - for (PartName matchedNode : matchedNodes) { - if (descendantCodes.contains(matchedNode.getCode())) { - isLeaf = false; - break; // 如果在子孙节点中找到匹配节点,当前根节点不是叶子节点 - } - } - node.setLeafFlag(isLeaf); // 设置叶子标志 - } - - return new ArrayList<>(rootNodes); + // 按名字排序 + return rootNodes.stream() + .sorted(Comparator.comparing(PartName::getName)) + .collect(Collectors.toList()); } - // 方法:获取给定节点ID的所有子孙节点ID - private Set getAllDescendantCodes(String parentCode, List allNodes) { + // 优化后的获取子孙节点ID方法,使用节点映射避免重复计算 + private Set getAllDescendantCodes(String parentCode, Map nodeMap) { Set descendantCodes = new HashSet<>(); - List directChildren = allNodes.stream() - .filter(node -> node.getParentCode().equals(parentCode)) - .collect(Collectors.toList()); + Deque stack = new ArrayDeque<>(); + stack.push(parentCode); - for (PartName child : directChildren) { - descendantCodes.add(child.getCode()); - descendantCodes.addAll(getAllDescendantCodes(child.getCode(), allNodes)); // 递归获取子孙节点 + while (!stack.isEmpty()) { + String currentCode = stack.pop(); + nodeMap.values().parallelStream() + .filter(node -> node.getParentCode().equals(currentCode)) + .forEach(child -> { + descendantCodes.add(child.getCode()); + stack.push(child.getCode()); + }); } return descendantCodes; @@ -259,12 +257,14 @@ public class PartNameServiceImpl extends ServiceImpl @Override public List getChild(String parentCode, String nodeName) { - // 查询所有节点 + // 查询所有节点并建立父节点映射 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); List allNodes = list(queryWrapper); + Map nodeMap = allNodes.stream() + .collect(Collectors.toMap(PartName::getCode, node -> node)); // 通过 nodeName 过滤符合条件的节点 - List matchedNodes = allNodes.stream() + List matchedNodes = allNodes.parallelStream() .filter(node -> node.getName() != null && node.getName().contains(nodeName)) .collect(Collectors.toList()); @@ -273,34 +273,31 @@ public class PartNameServiceImpl extends ServiceImpl } // 用于存储一级节点 - Set rootNodes = new HashSet<>(); + Set rootNodes = ConcurrentHashMap.newKeySet(); - // 查找每个匹配节点的一级父节点 - for (PartName matchedNode : matchedNodes) { + // 并行查找每个匹配节点的一级父节点 + matchedNodes.parallelStream().forEach(matchedNode -> { PartName currentNode = matchedNode; - while (currentNode != null && !currentNode.getParentCode().equals(parentCode)) { - // 查找当前节点的父节点 - String pCode = currentNode.getParentCode(); - currentNode = allNodes.stream() - .filter(node -> node.getCode().equals(pCode)) - .findFirst() - .orElse(null); + while (currentNode != null && !parentCode.equals(currentNode.getParentCode())) { + currentNode = nodeMap.get(currentNode.getParentCode()); } - // 添加一级节点到结果集 if (currentNode != null) { rootNodes.add(currentNode); } - } - - // 设置叶子标志 - Set rootNodeCodes = rootNodes.stream().map(PartName::getCode).collect(Collectors.toSet()); - rootNodes.forEach(node -> { - node.setLeafFlag(matchedNodes.stream() - .noneMatch(n -> (rootNodeCodes.contains(n.getParentCode()) && - n.getParentCode().equals(node.getCode())))); }); - return new ArrayList<>(rootNodes); + // 并行设置叶子标志 + rootNodes.parallelStream().forEach(node -> { + boolean isLeaf = matchedNodes.stream() + .noneMatch(n -> parentCode.equals(n.getParentCode()) && + n.getParentCode().equals(node.getCode())); + node.setLeafFlag(isLeaf); + }); + + // 按名字排序 + return rootNodes.stream() + .sorted(Comparator.comparing(PartName::getName)) + .collect(Collectors.toList()); } }