From f8dbf66bc9be4f41479cc77d9c62563142c6a1e1 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 6 May 2024 16:24:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DFuncComparator.thenComparing?= =?UTF-8?q?=E4=B8=8D=E7=94=9F=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../core/comparator/FuncComparator.java | 68 ++++++------------- 2 files changed, 23 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6e999539..8484ad0e4 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ * 【http 】 修复HttpDownloader全局超时无效问题(issue#3556@Github) * 【core 】 修复ZipReader.checkZipBomb遇到空目录报错问题(issue#I9K494@Gitee) * 【db 】 修复Oracle下特殊表名导致meta信息获取不到问题(issue#I9BANE@Gitee) +* 【db 】 修复FuncComparator.thenComparing不生效问题(issue#3569@Github) ------------------------------------------------------------------------------------------------------------- # 5.8.27(2024-03-29) diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/FuncComparator.java b/hutool-core/src/main/java/cn/hutool/core/comparator/FuncComparator.java index 6672c0ade..eb17c9c97 100644 --- a/hutool-core/src/main/java/cn/hutool/core/comparator/FuncComparator.java +++ b/hutool-core/src/main/java/cn/hutool/core/comparator/FuncComparator.java @@ -1,7 +1,5 @@ package cn.hutool.core.comparator; -import cn.hutool.core.util.ObjectUtil; - import java.util.function.Function; /** @@ -13,9 +11,6 @@ import java.util.function.Function; public class FuncComparator extends NullComparator { private static final long serialVersionUID = 1L; - private final boolean compareSelf; - private final Function> func; - /** * 构造 * @@ -31,48 +26,29 @@ public class FuncComparator extends NullComparator { * * @param nullGreater 是否{@code null}在后 * @param compareSelf 在字段值相同情况下,是否比较对象本身。 - * 如果此项为{@code false},字段值比较后为0会导致对象被认为相同,可能导致被去重。 - * @param func 比较项获取函数,此函数根据传入的一个对象,生成对应的可比较对象,然后根据这个返回值比较 - * @since 5.8.22 + * 如果此项为{@code false},字段值比较后为0会导致对象被认为相同,可能导致被去重。 + * @param func 比较项获取函数 */ - public FuncComparator(boolean nullGreater, boolean compareSelf, Function> func) { - super(nullGreater, null); - this.compareSelf = compareSelf; - this.func = func; - } + public FuncComparator(final boolean nullGreater, final boolean compareSelf, final Function> func) { + super(nullGreater, (a, b)->{ + // 通过给定函数转换对象为指定规则的可比较对象 + final Comparable v1; + final Comparable v2; + try { + v1 = func.apply(a); + v2 = func.apply(b); + } catch (final Exception e) { + throw new ComparatorException(e); + } - @Override - protected int doCompare(T a, T b) { - Comparable v1; - Comparable v2; - try { - v1 = func.apply(a); - v2 = func.apply(b); - } catch (Exception e) { - throw new ComparatorException(e); - } - - return compare(a, b, v1, v2); - } - - /** - * 对象及对应比较的值的综合比较
- * 考虑到如果对象对应的比较值相同,如对象的字段值相同,则返回相同结果,此时在TreeMap等容器比较去重时会去重。
- * 因此当{@link #compareSelf}为{@code true}时需要比较下对象本身以避免去重 - * - * @param o1 对象1 - * @param o2 对象2 - * @param v1 被比较的值1 - * @param v2 被比较的值2 - * @return 比较结果 - */ - @SuppressWarnings({"rawtypes", "unchecked"}) - private int compare(T o1, T o2, Comparable v1, Comparable v2) { - int result = ObjectUtil.compare(v1, v2, this.nullGreater); - if (compareSelf && 0 == result) { - //避免TreeSet / TreeMap 过滤掉排序字段相同但是对象不相同的情况 - result = CompareUtil.compare(o1, o2, this.nullGreater); - } - return result; + // 首先比较用户自定义的转换结果,如果为0,根据compareSelf参数决定是否比较对象本身。 + // compareSelf为false时,主要用于多规则比较,比如多字段比较的情况 + int result = CompareUtil.compare(v1, v2, nullGreater); + if (compareSelf && 0 == result) { + //避免TreeSet / TreeMap 过滤掉排序字段相同但是对象不相同的情况 + result = CompareUtil.compare(a, b, nullGreater); + } + return result; + }); } }