From 7a9e8457300781a62a4122c303fca05f398966c5 Mon Sep 17 00:00:00 2001 From: yixiaco <627428179@qq.com> Date: Fri, 15 Mar 2024 17:11:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E9=9B=86=E5=90=88?= =?UTF-8?q?=E5=B7=AE=E5=BC=82=E6=AF=94=E8=BE=83=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/utils/CollDiffOps.java | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/CollDiffOps.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/CollDiffOps.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/CollDiffOps.java new file mode 100644 index 00000000..a6475afb --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/CollDiffOps.java @@ -0,0 +1,165 @@ +package org.dromara.common.core.utils; + +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 集合差异比较工具 + * + * @author hexm + * @date 2024/03/15 15:12 + */ +public class CollDiffOps { + + /** Left数据 */ + private final Collection left; + /** Left数据转为比较对象 */ + private final Function leftConvert; + /** Right数据 */ + private final Collection right; + /** Right数据转为比较对象 */ + private final Function rightConvert; + + public CollDiffOps(Collection left, Function leftConvert, Collection right, Function rightConvert) { + this.left = left; + this.leftConvert = leftConvert; + this.right = right; + this.rightConvert = rightConvert; + } + + public static CollDiffOps getOps(Collection left, Collection right) { + return new CollDiffOps<>(left, Function.identity(), right, Function.identity()); + } + + public static CollDiffOps getOps(Collection left, Function leftConvert, Collection right) { + return new CollDiffOps<>(left, leftConvert, right, Function.identity()); + } + + public static CollDiffOps getOps(Collection left, Collection right, Function rightConvert) { + return new CollDiffOps<>(left, Function.identity(), right, rightConvert); + } + + public static CollDiffOps getOps(Collection left, Function leftConvert, Collection right, Function rightConvert) { + return new CollDiffOps<>(left, leftConvert, right, rightConvert); + } + + public static CollDiffOps getUniOps(Collection left, Collection right, Function convert) { + return new CollDiffOps<>(left, convert, right, convert); + } + + /** + * 获取差异的Left对象 + * + * @return + */ + public List getDiffLeft() { + return getDiff(left, leftConvert, right, rightConvert, Function.identity()); + } + + /** + * 获取差异的Left转换后对象 + * + * @return + */ + public List getDiffConvertLeft() { + return getDiff(left, leftConvert, right, rightConvert, leftConvert); + } + + /** + * 获取差异的Right对象 + * + * @return + */ + public List getDiffRight() { + return getDiff(right, rightConvert, left, leftConvert, Function.identity()); + } + + /** + * 获取差异的Right转换后对象 + * + * @return + */ + public List getDiffConvertRight() { + return getDiff(right, rightConvert, left, leftConvert, rightConvert); + } + + /** + * 获取相同的Left对象 + * + * @return + */ + public List getSameLeft() { + return getSame(left, leftConvert, right, rightConvert, Function.identity()); + } + + /** + * 获取相同的Left转换后对象 + * + * @return + */ + public List getSameConvertLeft() { + return getSame(left, leftConvert, right, rightConvert, leftConvert); + } + + /** + * 获取相同的Right对象 + * + * @return + */ + public List getSameRight() { + return getSame(right, rightConvert, left, leftConvert, Function.identity()); + } + + /** + * 获取相同的Right转换后对象 + * + * @return + */ + public List getSameConvertRight() { + return getSame(right, rightConvert, left, leftConvert, rightConvert); + } + + public CollDiffOps newLeft(Collection left, Function leftConvert) { + return new CollDiffOps<>(left, leftConvert, right, rightConvert); + } + + public CollDiffOps newRight(Collection right, Function rightConvert) { + return new CollDiffOps<>(left, leftConvert, right, rightConvert); + } + + /** + * 得到差异的left数据 + */ + private static List getDiff(Collection left, Function leftConvert, + Collection right, Function rightConvert, + Function resultConvert) { + Set rightSet = right.stream() + .map(rightConvert) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + return left.stream() + .filter(t -> !rightSet.contains(leftConvert.apply(t))) + .map(resultConvert) + .collect(Collectors.toList()); + } + + /** + * 得到相同的left数据 + */ + private static List getSame(Collection left, Function leftConvert, + Collection right, Function rightConvert, + Function resultConvert) { + Set rightSet = right.stream() + .map(rightConvert) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + return left.stream() + .filter(t -> rightSet.contains(leftConvert.apply(t))) + .map(resultConvert) + .collect(Collectors.toList()); + } +}