From cd66564ffd15c004078c7b9cec13b538864c71e4 Mon Sep 17 00:00:00 2001 From: yangfeng <1790182087@qq.com> Date: Thu, 22 Jan 2026 09:14:17 +0800 Subject: [PATCH] =?UTF-8?q?feat(BooleanUtil):=20=E6=96=B0=E5=A2=9E=20exact?= =?UTF-8?q?lyOneTrue=20=E6=96=B9=E6=B3=95=E7=94=A8=E4=BA=8E=E4=BA=92?= =?UTF-8?q?=E6=96=A5=E6=9D=A1=E4=BB=B6=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/util/BooleanUtil.java | 33 ++++++++++++++++++- .../cn/hutool/core/util/BooleanUtilTest.java | 20 +++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java index a6ac07d94c..f0b32bec8b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java @@ -445,6 +445,10 @@ public class BooleanUtil { /** * 对Boolean数组取异或 + * 当前实现的语义为:当数组中 true 的数量为奇数时返回 true,数量为偶数时返回 false。 + * + * 注意:该方法并不是判断“是否恰好只有一个 true”, + * 不适用于互斥条件校验(例如:多个条件只能有一个成立的场景)。 * *
* BooleanUtil.xor(true, true) = false
@@ -453,8 +457,10 @@ public class BooleanUtil {
* BooleanUtil.xor(true, true) = false
* BooleanUtil.xor(false, false) = false
* BooleanUtil.xor(true, false) = true
+ * BooleanUtil.xor(true, true, true) = true
+ * BooleanUtil.xor(true, true, false) = false
*
- *
+ * 如需判断“是否恰好只有一个 true”,请使用 {@link #exactlyOneTrue(boolean...)}。
* @param array {@code boolean}数组
* @return 如果异或计算为true返回 {@code true}
*/
@@ -471,6 +477,31 @@ public class BooleanUtil {
return result;
}
+ /**
+ * 判断 boolean 数组中是否 恰好只有一个 元素为 true。
+ * 常用于互斥条件校验场景,例如:
+ * 多个角色只能同时存在一个
+ * 多个条件只能命中一个分支
+ * 与 {@link #xor(boolean...)} 不同,
+ * 本方法在出现多个 true 时会直接返回 false。
+ *
+ * @param array boolean 数组
+ * @return 当且仅当数组中恰好只有一个 true 时返回 true
+ */
+ public static boolean exactlyOneTrue(final boolean... array) {
+ if (ArrayUtil.isEmpty(array)) {
+ throw new IllegalArgumentException("The Array must not be empty");
+ }
+
+ int count = 0;
+ for (boolean b : array) {
+ if (b && ++count > 1) {
+ return false;
+ }
+ }
+ return count == 1;
+ }
+
/**
* 对Boolean数组取异或
*
diff --git a/hutool-core/src/test/java/cn/hutool/core/util/BooleanUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/BooleanUtilTest.java
index 9310a9a48b..6a260de618 100644
--- a/hutool-core/src/test/java/cn/hutool/core/util/BooleanUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/util/BooleanUtilTest.java
@@ -106,4 +106,24 @@ public class BooleanUtilTest {
Boolean result = BooleanUtil.andOfWrap(boolean1, boolean2);
assertFalse(result);
}
+ @Test
+ public void testXorSemantics() {
+ // xor 的实际语义:true 的数量为奇数
+ assertTrue(BooleanUtil.xor(true, true, true));
+ assertFalse(BooleanUtil.xor(true, true));
+ }
+
+ @Test
+ public void testExactlyOneTrue() {
+ // 恰好只有一个 true
+ assertTrue(BooleanUtil.exactlyOneTrue(true, false, false));
+
+ // 多个 true,不符合互斥语义
+ assertFalse(BooleanUtil.exactlyOneTrue(true, true, false));
+ assertFalse(BooleanUtil.exactlyOneTrue(true, true, true));
+
+ // 没有 true
+ assertFalse(BooleanUtil.exactlyOneTrue(false, false, false));
+ }
+
}