From 2d5f84ebc226cde6d551ab578b6f0b8b24eaef84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=BE=9E=E6=9C=AA=E5=AF=92?= <545073804@qq.com> Date: Sat, 30 Aug 2025 16:46:04 +0800 Subject: [PATCH] =?UTF-8?q?upadte=20=E4=BC=98=E5=8C=96Stream=E6=B5=81?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/utils/StreamUtils.java | 149 ++++++++++++------ .../service/impl/FlwTaskServiceImpl.java | 16 +- 2 files changed, 105 insertions(+), 60 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java index f9e53a508..52995f237 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StreamUtils.java @@ -1,7 +1,6 @@ package org.dromara.common.core.utils; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.map.MapUtil; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -28,10 +27,12 @@ public class StreamUtils { */ public static List filter(Collection collection, Predicate function) { if (CollUtil.isEmpty(collection)) { - return CollUtil.newArrayList(); + return Collections.emptyList(); } - // 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题 - return collection.stream().filter(function).collect(Collectors.toList()); + return collection.stream() + .filter(function) + // 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题 + .collect(Collectors.toList()); } /** @@ -41,11 +42,24 @@ public class StreamUtils { * @param function 过滤方法 * @return 找到符合条件的第一个元素,没有则返回null */ - public static E findFirst(Collection collection, Predicate function) { + public static Optional findFirst(Collection collection, Predicate function) { if (CollUtil.isEmpty(collection)) { - return null; + return Optional.empty(); } - return collection.stream().filter(function).findFirst().orElse(null); + return collection.stream() + .filter(function) + .findFirst(); + } + + /** + * 找到流中满足条件的第一个元素值 + * + * @param collection 需要查询的集合 + * @param function 过滤方法 + * @return 找到符合条件的第一个元素,没有则返回 Optional.empty(); + */ + public static E findFirstValue(Collection collection, Predicate function) { + return findFirst(collection,function).orElse(null); } /** @@ -59,7 +73,20 @@ public class StreamUtils { if (CollUtil.isEmpty(collection)) { return Optional.empty(); } - return collection.stream().filter(function).findAny(); + return collection.stream() + .filter(function) + .findAny(); + } + + /** + * 找到流中任意一个满足条件的元素值 + * + * @param collection 需要查询的集合 + * @param function 过滤方法 + * @return 找到符合条件的任意一个元素,没有则返回null + */ + public static E findAnyValue(Collection collection, Predicate function) { + return findAny(collection,function).orElse(null); } /** @@ -85,7 +112,10 @@ public class StreamUtils { if (CollUtil.isEmpty(collection)) { return StringUtils.EMPTY; } - return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.joining(delimiter)); + return collection.stream() + .map(function) + .filter(Objects::nonNull) + .collect(Collectors.joining(delimiter)); } /** @@ -97,10 +127,13 @@ public class StreamUtils { */ public static List sorted(Collection collection, Comparator comparing) { if (CollUtil.isEmpty(collection)) { - return CollUtil.newArrayList(); + return Collections.emptyList(); } - // 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题 - return collection.stream().filter(Objects::nonNull).sorted(comparing).collect(Collectors.toList()); + return collection.stream() + .filter(Objects::nonNull) + .sorted(comparing) + // 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题 + .collect(Collectors.toList()); } /** @@ -115,9 +148,11 @@ public class StreamUtils { */ public static Map toIdentityMap(Collection collection, Function key) { if (CollUtil.isEmpty(collection)) { - return MapUtil.newHashMap(); + return Collections.emptyMap(); } - return collection.stream().filter(Objects::nonNull).collect(Collectors.toMap(key, Function.identity(), (l, r) -> l)); + return collection.stream() + .filter(Objects::nonNull) + .collect(Collectors.toMap(key, Function.identity(), (l, r) -> l)); } /** @@ -134,9 +169,27 @@ public class StreamUtils { */ public static Map toMap(Collection collection, Function key, Function value) { if (CollUtil.isEmpty(collection)) { - return MapUtil.newHashMap(); + return Collections.emptyMap(); } - return collection.stream().filter(Objects::nonNull).collect(Collectors.toMap(key, value, (l, r) -> l)); + return collection.stream() + .filter(Objects::nonNull) + .collect(Collectors.toMap(key, value, (l, r) -> l)); + } + + /** + * 获取 map 中的数据作为新 Map 的 value ,key 不变 + * @param map 需要处理的map + * @param take 取值函数 + * @param map中的key类型 + * @param map中的value类型 + * @param 新map中的value类型 + * @return 新的map + */ + public static Map toMap(Map map, BiFunction take) { + if (CollUtil.isEmpty(map)) { + return Collections.emptyMap(); + } + return toMap(map.entrySet(), Map.Entry::getKey, entry -> take.apply(entry.getKey(), entry.getValue())); } /** @@ -151,10 +204,10 @@ public class StreamUtils { */ public static Map> groupByKey(Collection collection, Function key) { if (CollUtil.isEmpty(collection)) { - return MapUtil.newHashMap(); + return Collections.emptyMap(); } - return collection - .stream().filter(Objects::nonNull) + return collection.stream() + .filter(Objects::nonNull) .collect(Collectors.groupingBy(key, LinkedHashMap::new, Collectors.toList())); } @@ -172,10 +225,10 @@ public class StreamUtils { */ public static Map>> groupBy2Key(Collection collection, Function key1, Function key2) { if (CollUtil.isEmpty(collection)) { - return MapUtil.newHashMap(); + return Collections.emptyMap(); } - return collection - .stream().filter(Objects::nonNull) + return collection.stream() + .filter(Objects::nonNull) .collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.groupingBy(key2, LinkedHashMap::new, Collectors.toList()))); } @@ -192,11 +245,11 @@ public class StreamUtils { * @return 分类后的map */ public static Map> group2Map(Collection collection, Function key1, Function key2) { - if (CollUtil.isEmpty(collection) || key1 == null || key2 == null) { - return MapUtil.newHashMap(); + if (CollUtil.isEmpty(collection)) { + return Collections.emptyMap(); } - return collection - .stream().filter(Objects::nonNull) + return collection.stream() + .filter(Objects::nonNull) .collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.toMap(key2, Function.identity(), (l, r) -> l))); } @@ -212,10 +265,9 @@ public class StreamUtils { */ public static List toList(Collection collection, Function function) { if (CollUtil.isEmpty(collection)) { - return CollUtil.newArrayList(); + return Collections.emptyList(); } - return collection - .stream() + return collection.stream() .map(function) .filter(Objects::nonNull) // 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题 @@ -233,11 +285,10 @@ public class StreamUtils { * @return 转化后的Set */ public static Set toSet(Collection collection, Function function) { - if (CollUtil.isEmpty(collection) || function == null) { - return CollUtil.newHashSet(); + if (CollUtil.isEmpty(collection)) { + return Collections.emptySet(); } - return collection - .stream() + return collection.stream() .map(function) .filter(Objects::nonNull) .collect(Collectors.toSet()); @@ -257,26 +308,20 @@ public class StreamUtils { * @return 合并后的map */ public static Map merge(Map map1, Map map2, BiFunction merge) { - if (MapUtil.isEmpty(map1) && MapUtil.isEmpty(map2)) { - return MapUtil.newHashMap(); - } else if (MapUtil.isEmpty(map1)) { - map1 = MapUtil.newHashMap(); - } else if (MapUtil.isEmpty(map2)) { - map2 = MapUtil.newHashMap(); + if (CollUtil.isEmpty(map1) && CollUtil.isEmpty(map2)) { + // 如果两个 map 都为空,则直接返回空的 map + return Collections.emptyMap(); + } else if (CollUtil.isEmpty(map1)) { + // 如果 map1 为空,则直接处理返回 map2 + return toMap(map2.entrySet(), Map.Entry::getKey, entry -> merge.apply(null, entry.getValue())); + } else if (CollUtil.isEmpty(map2)) { + // 如果 map2 为空,则直接处理返回 map1 + return toMap(map1.entrySet(), Map.Entry::getKey, entry -> merge.apply(entry.getValue(), null)); } - Set key = new HashSet<>(); - key.addAll(map1.keySet()); - key.addAll(map2.keySet()); - Map map = new HashMap<>(); - for (K t : key) { - X x = map1.get(t); - Y y = map2.get(t); - V z = merge.apply(x, y); - if (z != null) { - map.put(t, z); - } - } - return map; + Set keySet = new HashSet<>(); + keySet.addAll(map1.keySet()); + keySet.addAll(map2.keySet()); + return toMap(keySet, key -> key, key -> merge.apply(map1.get(key), map2.get(key))); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index d41bfdf04..81807b58f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -638,14 +638,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService { //办理人变量替换 ExpressionUtil.evalVariable(buildNextTaskList, FlowParams.build().variable(mergeVariable)); for (FlowNode flowNode : nextFlowNodes) { - Task first = StreamUtils.findFirst(buildNextTaskList, t -> t.getNodeCode().equals(flowNode.getNodeCode())); - if (ObjectUtil.isNotNull(first) && CollUtil.isNotEmpty(first.getPermissionList())) { - List users = flwTaskAssigneeService.fetchUsersByStorageIds(StringUtils.joinComma(first.getPermissionList())); - if (CollUtil.isNotEmpty(users)) { - flowNode.setPermissionFlag(StreamUtils.join(users, e -> Convert.toStr(e.getUserId()))); - } - } - + StreamUtils.findFirst(buildNextTaskList, t -> t.getNodeCode().equals(flowNode.getNodeCode())) + .ifPresent(first -> { + List users; + if (CollUtil.isNotEmpty(first.getPermissionList()) + && CollUtil.isNotEmpty(users = flwTaskAssigneeService.fetchUsersByStorageIds(StringUtils.joinComma(first.getPermissionList())))) { + flowNode.setPermissionFlag(StreamUtils.join(users, e -> Convert.toStr(e.getUserId()))); + } + }); } } return nextFlowNodes;