From 4db9c44d18dddbbfdb91272c0b7612924d4e0ec4 Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Mon, 13 Mar 2023 18:23:14 +0800 Subject: [PATCH 01/10] =?UTF-8?q?[feature]=20=E6=96=B0=E5=A2=9EBooleanUtil?= =?UTF-8?q?.isJsFalsy=E4=BB=A5=E5=8F=8AisJsTruthy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/util/BooleanUtil.java | 26 +++++++++++++++++ .../cn/hutool/core/util/BooleanUtilTest.java | 28 ++++++++++++++++++- 2 files changed, 53 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 6825f0c07..24bd72b1b 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 @@ -17,6 +17,8 @@ public class BooleanUtil { private static final Set TRUE_SET = SetUtil.of("true", "yes", "y", "t", "ok", "1", "on", "是", "对", "真", "對", "√"); /** 表示为假的字符串 */ private static final Set FALSE_SET = SetUtil.of("false", "no", "n", "f", "0", "off", "否", "错", "假", "錯", "×"); + /** js中表示假值Falsy的部分值 false、0、-0、0n、""、null、undefined 和 NaN */ + public static final Set FALSY_SET = SetUtil.of(false, 0, -0, 0L, 0.0D, -0.0D, "", null); /** * 取相反值 @@ -522,4 +524,28 @@ public class BooleanUtil { public static boolean isBoolean(final Class clazz) { return (clazz == Boolean.class || clazz == boolean.class); } + + /** + * 是否为假值(定义来源js) + * + * @param value 参数 + * @return 是否为假值 + * 定义{@see https://developer.mozilla.org/zh-CN/docs/Glossary/Falsy} + */ + public static boolean isJsFalsy(Object value) { + return FALSY_SET.contains(value); + } + + /** + * 是否为真值(定义来源js) + * 所有除 false、0、-0、0n、""、null、undefined 和 NaN 以外的皆为真值 + * 由于java中无法使用值来代表undefined 和 NaN,因此此处不做判断 + * + * @param value 参数 + * @return 是否为真值 + * 定义{@see https://developer.mozilla.org/zh-CN/docs/Glossary/Truthy} + */ + public static boolean isJsTruthy(Object value) { + return false == isJsFalsy(value); + } } 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 d143ab03b..f6314eae6 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 @@ -86,7 +86,7 @@ public class BooleanUtilTest { @SuppressWarnings("ConstantConditions") @Test - public void toBooleanObjectTest(){ + public void toBooleanObjectTest() { Assert.assertTrue(BooleanUtil.toBooleanObject("yes")); Assert.assertTrue(BooleanUtil.toBooleanObject("真")); Assert.assertTrue(BooleanUtil.toBooleanObject("是")); @@ -95,4 +95,30 @@ public class BooleanUtilTest { Assert.assertNull(BooleanUtil.toBooleanObject(null)); Assert.assertNull(BooleanUtil.toBooleanObject("不识别")); } + + @Test + public void isJsFalsyTest() { + Assert.assertTrue(BooleanUtil.isJsFalsy(false)); + Assert.assertTrue(BooleanUtil.isJsFalsy(0)); + Assert.assertTrue(BooleanUtil.isJsFalsy(-0)); + Assert.assertTrue(BooleanUtil.isJsFalsy(0L)); + Assert.assertTrue(BooleanUtil.isJsFalsy(0.0D)); + Assert.assertTrue(BooleanUtil.isJsFalsy(0.00D)); + Assert.assertTrue(BooleanUtil.isJsFalsy(-0.00D)); + Assert.assertTrue(BooleanUtil.isJsFalsy("")); + Assert.assertTrue(BooleanUtil.isJsFalsy(null)); + } + + @Test + public void isJsTruthyTest() { + Assert.assertTrue(BooleanUtil.isJsTruthy(true)); + Assert.assertTrue(BooleanUtil.isJsTruthy(1)); + Assert.assertTrue(BooleanUtil.isJsTruthy(-1)); + Assert.assertTrue(BooleanUtil.isJsTruthy("0")); + Assert.assertTrue(BooleanUtil.isJsTruthy("null")); + Assert.assertTrue(BooleanUtil.isJsTruthy("undefined")); + Assert.assertTrue(BooleanUtil.isJsTruthy(1L)); + Assert.assertTrue(BooleanUtil.isJsTruthy(0.1D)); + Assert.assertTrue(BooleanUtil.isJsTruthy(-0.01D)); + } } From 4ccb44ee2694c1b0b514985465335d77be1fdb63 Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Tue, 14 Mar 2023 11:06:28 +0800 Subject: [PATCH 02/10] =?UTF-8?q?[enhancement]=20=E6=94=AF=E6=8C=81Float?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/util/BooleanUtil.java | 2 +- .../src/test/java/cn/hutool/core/util/BooleanUtilTest.java | 4 ++++ 2 files changed, 5 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 24bd72b1b..43119ee2e 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 @@ -18,7 +18,7 @@ public class BooleanUtil { /** 表示为假的字符串 */ private static final Set FALSE_SET = SetUtil.of("false", "no", "n", "f", "0", "off", "否", "错", "假", "錯", "×"); /** js中表示假值Falsy的部分值 false、0、-0、0n、""、null、undefined 和 NaN */ - public static final Set FALSY_SET = SetUtil.of(false, 0, -0, 0L, 0.0D, -0.0D, "", null); + public static final Set FALSY_SET = SetUtil.of(false, 0, -0, 0L, 0.0D, -0.0D, 0.0F, -0.0F, "", null); /** * 取相反值 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 f6314eae6..7c4721720 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 @@ -105,6 +105,9 @@ public class BooleanUtilTest { Assert.assertTrue(BooleanUtil.isJsFalsy(0.0D)); Assert.assertTrue(BooleanUtil.isJsFalsy(0.00D)); Assert.assertTrue(BooleanUtil.isJsFalsy(-0.00D)); + Assert.assertTrue(BooleanUtil.isJsFalsy(0.0F)); + Assert.assertTrue(BooleanUtil.isJsFalsy(0.00F)); + Assert.assertTrue(BooleanUtil.isJsFalsy(-0.00F)); Assert.assertTrue(BooleanUtil.isJsFalsy("")); Assert.assertTrue(BooleanUtil.isJsFalsy(null)); } @@ -120,5 +123,6 @@ public class BooleanUtilTest { Assert.assertTrue(BooleanUtil.isJsTruthy(1L)); Assert.assertTrue(BooleanUtil.isJsTruthy(0.1D)); Assert.assertTrue(BooleanUtil.isJsTruthy(-0.01D)); + Assert.assertTrue(BooleanUtil.isJsTruthy(-0.01F)); } } From d620a72585f286f07cc7220a6651937b4f4a6972 Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Tue, 14 Mar 2023 15:53:38 +0800 Subject: [PATCH 03/10] =?UTF-8?q?[enhancement]=20=E6=94=AF=E6=8C=81NaN?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/util/BooleanUtil.java | 10 ++++++++-- .../test/java/cn/hutool/core/util/BooleanUtilTest.java | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) 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 43119ee2e..79f5a74ca 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 @@ -533,13 +533,19 @@ public class BooleanUtil { * 定义{@see https://developer.mozilla.org/zh-CN/docs/Glossary/Falsy} */ public static boolean isJsFalsy(Object value) { - return FALSY_SET.contains(value); + if (FALSY_SET.contains(value)) { + return true; + } + if (value instanceof Double) { + return Double.isNaN((Double) value); + } + return false; } /** * 是否为真值(定义来源js) * 所有除 false、0、-0、0n、""、null、undefined 和 NaN 以外的皆为真值 - * 由于java中无法使用值来代表undefined 和 NaN,因此此处不做判断 + * 由于java中无法使用值来代表undefined,因此此处不做判断 * * @param value 参数 * @return 是否为真值 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 7c4721720..75120c36f 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 @@ -110,6 +110,7 @@ public class BooleanUtilTest { Assert.assertTrue(BooleanUtil.isJsFalsy(-0.00F)); Assert.assertTrue(BooleanUtil.isJsFalsy("")); Assert.assertTrue(BooleanUtil.isJsFalsy(null)); + Assert.assertTrue(BooleanUtil.isJsFalsy(Math.sqrt(-1))); } @Test From 5cd64819535054d90c10c933104f35ba76f67ec1 Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Tue, 14 Mar 2023 16:05:19 +0800 Subject: [PATCH 04/10] =?UTF-8?q?[enhancement]=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/util/BooleanUtil.java | 6 +-- .../cn/hutool/core/util/BooleanUtilTest.java | 50 +++++++++---------- 2 files changed, 28 insertions(+), 28 deletions(-) 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 79f5a74ca..47a23738e 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 @@ -532,7 +532,7 @@ public class BooleanUtil { * @return 是否为假值 * 定义{@see https://developer.mozilla.org/zh-CN/docs/Glossary/Falsy} */ - public static boolean isJsFalsy(Object value) { + public static boolean isFalsy(Object value) { if (FALSY_SET.contains(value)) { return true; } @@ -551,7 +551,7 @@ public class BooleanUtil { * @return 是否为真值 * 定义{@see https://developer.mozilla.org/zh-CN/docs/Glossary/Truthy} */ - public static boolean isJsTruthy(Object value) { - return false == isJsFalsy(value); + public static boolean isTruthy(Object value) { + return false == isFalsy(value); } } 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 75120c36f..a4c468575 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 @@ -97,33 +97,33 @@ public class BooleanUtilTest { } @Test - public void isJsFalsyTest() { - Assert.assertTrue(BooleanUtil.isJsFalsy(false)); - Assert.assertTrue(BooleanUtil.isJsFalsy(0)); - Assert.assertTrue(BooleanUtil.isJsFalsy(-0)); - Assert.assertTrue(BooleanUtil.isJsFalsy(0L)); - Assert.assertTrue(BooleanUtil.isJsFalsy(0.0D)); - Assert.assertTrue(BooleanUtil.isJsFalsy(0.00D)); - Assert.assertTrue(BooleanUtil.isJsFalsy(-0.00D)); - Assert.assertTrue(BooleanUtil.isJsFalsy(0.0F)); - Assert.assertTrue(BooleanUtil.isJsFalsy(0.00F)); - Assert.assertTrue(BooleanUtil.isJsFalsy(-0.00F)); - Assert.assertTrue(BooleanUtil.isJsFalsy("")); - Assert.assertTrue(BooleanUtil.isJsFalsy(null)); - Assert.assertTrue(BooleanUtil.isJsFalsy(Math.sqrt(-1))); + public void isFalsyTest() { + Assert.assertTrue(BooleanUtil.isFalsy(false)); + Assert.assertTrue(BooleanUtil.isFalsy(0)); + Assert.assertTrue(BooleanUtil.isFalsy(-0)); + Assert.assertTrue(BooleanUtil.isFalsy(0L)); + Assert.assertTrue(BooleanUtil.isFalsy(0.0D)); + Assert.assertTrue(BooleanUtil.isFalsy(0.00D)); + Assert.assertTrue(BooleanUtil.isFalsy(-0.00D)); + Assert.assertTrue(BooleanUtil.isFalsy(0.0F)); + Assert.assertTrue(BooleanUtil.isFalsy(0.00F)); + Assert.assertTrue(BooleanUtil.isFalsy(-0.00F)); + Assert.assertTrue(BooleanUtil.isFalsy("")); + Assert.assertTrue(BooleanUtil.isFalsy(null)); + Assert.assertTrue(BooleanUtil.isFalsy(Math.sqrt(-1))); } @Test - public void isJsTruthyTest() { - Assert.assertTrue(BooleanUtil.isJsTruthy(true)); - Assert.assertTrue(BooleanUtil.isJsTruthy(1)); - Assert.assertTrue(BooleanUtil.isJsTruthy(-1)); - Assert.assertTrue(BooleanUtil.isJsTruthy("0")); - Assert.assertTrue(BooleanUtil.isJsTruthy("null")); - Assert.assertTrue(BooleanUtil.isJsTruthy("undefined")); - Assert.assertTrue(BooleanUtil.isJsTruthy(1L)); - Assert.assertTrue(BooleanUtil.isJsTruthy(0.1D)); - Assert.assertTrue(BooleanUtil.isJsTruthy(-0.01D)); - Assert.assertTrue(BooleanUtil.isJsTruthy(-0.01F)); + public void isTruthyTest() { + Assert.assertTrue(BooleanUtil.isTruthy(true)); + Assert.assertTrue(BooleanUtil.isTruthy(1)); + Assert.assertTrue(BooleanUtil.isTruthy(-1)); + Assert.assertTrue(BooleanUtil.isTruthy("0")); + Assert.assertTrue(BooleanUtil.isTruthy("null")); + Assert.assertTrue(BooleanUtil.isTruthy("undefined")); + Assert.assertTrue(BooleanUtil.isTruthy(1L)); + Assert.assertTrue(BooleanUtil.isTruthy(0.1D)); + Assert.assertTrue(BooleanUtil.isTruthy(-0.01D)); + Assert.assertTrue(BooleanUtil.isTruthy(-0.01F)); } } From 5a4ed96e0dca88c53596a3d162dab64dc27496e5 Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Wed, 15 Mar 2023 09:59:44 +0800 Subject: [PATCH 05/10] =?UTF-8?q?Revert=20"[enhancement]=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=96=B9=E6=B3=95=E5=90=8D"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 5cd64819535054d90c10c933104f35ba76f67ec1. --- .../java/cn/hutool/core/util/BooleanUtil.java | 6 +-- .../cn/hutool/core/util/BooleanUtilTest.java | 50 +++++++++---------- 2 files changed, 28 insertions(+), 28 deletions(-) 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 47a23738e..79f5a74ca 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 @@ -532,7 +532,7 @@ public class BooleanUtil { * @return 是否为假值 * 定义{@see https://developer.mozilla.org/zh-CN/docs/Glossary/Falsy} */ - public static boolean isFalsy(Object value) { + public static boolean isJsFalsy(Object value) { if (FALSY_SET.contains(value)) { return true; } @@ -551,7 +551,7 @@ public class BooleanUtil { * @return 是否为真值 * 定义{@see https://developer.mozilla.org/zh-CN/docs/Glossary/Truthy} */ - public static boolean isTruthy(Object value) { - return false == isFalsy(value); + public static boolean isJsTruthy(Object value) { + return false == isJsFalsy(value); } } 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 a4c468575..75120c36f 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 @@ -97,33 +97,33 @@ public class BooleanUtilTest { } @Test - public void isFalsyTest() { - Assert.assertTrue(BooleanUtil.isFalsy(false)); - Assert.assertTrue(BooleanUtil.isFalsy(0)); - Assert.assertTrue(BooleanUtil.isFalsy(-0)); - Assert.assertTrue(BooleanUtil.isFalsy(0L)); - Assert.assertTrue(BooleanUtil.isFalsy(0.0D)); - Assert.assertTrue(BooleanUtil.isFalsy(0.00D)); - Assert.assertTrue(BooleanUtil.isFalsy(-0.00D)); - Assert.assertTrue(BooleanUtil.isFalsy(0.0F)); - Assert.assertTrue(BooleanUtil.isFalsy(0.00F)); - Assert.assertTrue(BooleanUtil.isFalsy(-0.00F)); - Assert.assertTrue(BooleanUtil.isFalsy("")); - Assert.assertTrue(BooleanUtil.isFalsy(null)); - Assert.assertTrue(BooleanUtil.isFalsy(Math.sqrt(-1))); + public void isJsFalsyTest() { + Assert.assertTrue(BooleanUtil.isJsFalsy(false)); + Assert.assertTrue(BooleanUtil.isJsFalsy(0)); + Assert.assertTrue(BooleanUtil.isJsFalsy(-0)); + Assert.assertTrue(BooleanUtil.isJsFalsy(0L)); + Assert.assertTrue(BooleanUtil.isJsFalsy(0.0D)); + Assert.assertTrue(BooleanUtil.isJsFalsy(0.00D)); + Assert.assertTrue(BooleanUtil.isJsFalsy(-0.00D)); + Assert.assertTrue(BooleanUtil.isJsFalsy(0.0F)); + Assert.assertTrue(BooleanUtil.isJsFalsy(0.00F)); + Assert.assertTrue(BooleanUtil.isJsFalsy(-0.00F)); + Assert.assertTrue(BooleanUtil.isJsFalsy("")); + Assert.assertTrue(BooleanUtil.isJsFalsy(null)); + Assert.assertTrue(BooleanUtil.isJsFalsy(Math.sqrt(-1))); } @Test - public void isTruthyTest() { - Assert.assertTrue(BooleanUtil.isTruthy(true)); - Assert.assertTrue(BooleanUtil.isTruthy(1)); - Assert.assertTrue(BooleanUtil.isTruthy(-1)); - Assert.assertTrue(BooleanUtil.isTruthy("0")); - Assert.assertTrue(BooleanUtil.isTruthy("null")); - Assert.assertTrue(BooleanUtil.isTruthy("undefined")); - Assert.assertTrue(BooleanUtil.isTruthy(1L)); - Assert.assertTrue(BooleanUtil.isTruthy(0.1D)); - Assert.assertTrue(BooleanUtil.isTruthy(-0.01D)); - Assert.assertTrue(BooleanUtil.isTruthy(-0.01F)); + public void isJsTruthyTest() { + Assert.assertTrue(BooleanUtil.isJsTruthy(true)); + Assert.assertTrue(BooleanUtil.isJsTruthy(1)); + Assert.assertTrue(BooleanUtil.isJsTruthy(-1)); + Assert.assertTrue(BooleanUtil.isJsTruthy("0")); + Assert.assertTrue(BooleanUtil.isJsTruthy("null")); + Assert.assertTrue(BooleanUtil.isJsTruthy("undefined")); + Assert.assertTrue(BooleanUtil.isJsTruthy(1L)); + Assert.assertTrue(BooleanUtil.isJsTruthy(0.1D)); + Assert.assertTrue(BooleanUtil.isJsTruthy(-0.01D)); + Assert.assertTrue(BooleanUtil.isJsTruthy(-0.01F)); } } From 8efe8fb2fda6610a6fe6505a69f54652f1444079 Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Wed, 15 Mar 2023 09:59:48 +0800 Subject: [PATCH 06/10] =?UTF-8?q?Revert=20"[enhancement]=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81NaN=E7=B1=BB=E5=9E=8B"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit d620a72585f286f07cc7220a6651937b4f4a6972. --- .../src/main/java/cn/hutool/core/util/BooleanUtil.java | 10 ++-------- .../test/java/cn/hutool/core/util/BooleanUtilTest.java | 1 - 2 files changed, 2 insertions(+), 9 deletions(-) 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 79f5a74ca..43119ee2e 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 @@ -533,19 +533,13 @@ public class BooleanUtil { * 定义{@see https://developer.mozilla.org/zh-CN/docs/Glossary/Falsy} */ public static boolean isJsFalsy(Object value) { - if (FALSY_SET.contains(value)) { - return true; - } - if (value instanceof Double) { - return Double.isNaN((Double) value); - } - return false; + return FALSY_SET.contains(value); } /** * 是否为真值(定义来源js) * 所有除 false、0、-0、0n、""、null、undefined 和 NaN 以外的皆为真值 - * 由于java中无法使用值来代表undefined,因此此处不做判断 + * 由于java中无法使用值来代表undefined 和 NaN,因此此处不做判断 * * @param value 参数 * @return 是否为真值 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 75120c36f..7c4721720 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 @@ -110,7 +110,6 @@ public class BooleanUtilTest { Assert.assertTrue(BooleanUtil.isJsFalsy(-0.00F)); Assert.assertTrue(BooleanUtil.isJsFalsy("")); Assert.assertTrue(BooleanUtil.isJsFalsy(null)); - Assert.assertTrue(BooleanUtil.isJsFalsy(Math.sqrt(-1))); } @Test From 2919749c8f1c23961fff9e4cf76e02aed888803f Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Wed, 15 Mar 2023 09:59:53 +0800 Subject: [PATCH 07/10] =?UTF-8?q?Revert=20"[enhancement]=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81Float=E7=B1=BB=E5=9E=8B"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 4ccb44ee2694c1b0b514985465335d77be1fdb63. --- .../src/main/java/cn/hutool/core/util/BooleanUtil.java | 2 +- .../src/test/java/cn/hutool/core/util/BooleanUtilTest.java | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) 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 43119ee2e..24bd72b1b 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 @@ -18,7 +18,7 @@ public class BooleanUtil { /** 表示为假的字符串 */ private static final Set FALSE_SET = SetUtil.of("false", "no", "n", "f", "0", "off", "否", "错", "假", "錯", "×"); /** js中表示假值Falsy的部分值 false、0、-0、0n、""、null、undefined 和 NaN */ - public static final Set FALSY_SET = SetUtil.of(false, 0, -0, 0L, 0.0D, -0.0D, 0.0F, -0.0F, "", null); + public static final Set FALSY_SET = SetUtil.of(false, 0, -0, 0L, 0.0D, -0.0D, "", null); /** * 取相反值 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 7c4721720..f6314eae6 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 @@ -105,9 +105,6 @@ public class BooleanUtilTest { Assert.assertTrue(BooleanUtil.isJsFalsy(0.0D)); Assert.assertTrue(BooleanUtil.isJsFalsy(0.00D)); Assert.assertTrue(BooleanUtil.isJsFalsy(-0.00D)); - Assert.assertTrue(BooleanUtil.isJsFalsy(0.0F)); - Assert.assertTrue(BooleanUtil.isJsFalsy(0.00F)); - Assert.assertTrue(BooleanUtil.isJsFalsy(-0.00F)); Assert.assertTrue(BooleanUtil.isJsFalsy("")); Assert.assertTrue(BooleanUtil.isJsFalsy(null)); } @@ -123,6 +120,5 @@ public class BooleanUtilTest { Assert.assertTrue(BooleanUtil.isJsTruthy(1L)); Assert.assertTrue(BooleanUtil.isJsTruthy(0.1D)); Assert.assertTrue(BooleanUtil.isJsTruthy(-0.01D)); - Assert.assertTrue(BooleanUtil.isJsTruthy(-0.01F)); } } From a1144f5228df187431bb6b9e4af1c755a2e1923c Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Wed, 15 Mar 2023 09:59:58 +0800 Subject: [PATCH 08/10] =?UTF-8?q?Revert=20"[feature]=20=E6=96=B0=E5=A2=9EB?= =?UTF-8?q?ooleanUtil.isJsFalsy=E4=BB=A5=E5=8F=8AisJsTruthy"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 4db9c44d18dddbbfdb91272c0b7612924d4e0ec4. --- .../java/cn/hutool/core/util/BooleanUtil.java | 26 ----------------- .../cn/hutool/core/util/BooleanUtilTest.java | 28 +------------------ 2 files changed, 1 insertion(+), 53 deletions(-) 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 24bd72b1b..6825f0c07 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 @@ -17,8 +17,6 @@ public class BooleanUtil { private static final Set TRUE_SET = SetUtil.of("true", "yes", "y", "t", "ok", "1", "on", "是", "对", "真", "對", "√"); /** 表示为假的字符串 */ private static final Set FALSE_SET = SetUtil.of("false", "no", "n", "f", "0", "off", "否", "错", "假", "錯", "×"); - /** js中表示假值Falsy的部分值 false、0、-0、0n、""、null、undefined 和 NaN */ - public static final Set FALSY_SET = SetUtil.of(false, 0, -0, 0L, 0.0D, -0.0D, "", null); /** * 取相反值 @@ -524,28 +522,4 @@ public class BooleanUtil { public static boolean isBoolean(final Class clazz) { return (clazz == Boolean.class || clazz == boolean.class); } - - /** - * 是否为假值(定义来源js) - * - * @param value 参数 - * @return 是否为假值 - * 定义{@see https://developer.mozilla.org/zh-CN/docs/Glossary/Falsy} - */ - public static boolean isJsFalsy(Object value) { - return FALSY_SET.contains(value); - } - - /** - * 是否为真值(定义来源js) - * 所有除 false、0、-0、0n、""、null、undefined 和 NaN 以外的皆为真值 - * 由于java中无法使用值来代表undefined 和 NaN,因此此处不做判断 - * - * @param value 参数 - * @return 是否为真值 - * 定义{@see https://developer.mozilla.org/zh-CN/docs/Glossary/Truthy} - */ - public static boolean isJsTruthy(Object value) { - return false == isJsFalsy(value); - } } 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 f6314eae6..d143ab03b 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 @@ -86,7 +86,7 @@ public class BooleanUtilTest { @SuppressWarnings("ConstantConditions") @Test - public void toBooleanObjectTest() { + public void toBooleanObjectTest(){ Assert.assertTrue(BooleanUtil.toBooleanObject("yes")); Assert.assertTrue(BooleanUtil.toBooleanObject("真")); Assert.assertTrue(BooleanUtil.toBooleanObject("是")); @@ -95,30 +95,4 @@ public class BooleanUtilTest { Assert.assertNull(BooleanUtil.toBooleanObject(null)); Assert.assertNull(BooleanUtil.toBooleanObject("不识别")); } - - @Test - public void isJsFalsyTest() { - Assert.assertTrue(BooleanUtil.isJsFalsy(false)); - Assert.assertTrue(BooleanUtil.isJsFalsy(0)); - Assert.assertTrue(BooleanUtil.isJsFalsy(-0)); - Assert.assertTrue(BooleanUtil.isJsFalsy(0L)); - Assert.assertTrue(BooleanUtil.isJsFalsy(0.0D)); - Assert.assertTrue(BooleanUtil.isJsFalsy(0.00D)); - Assert.assertTrue(BooleanUtil.isJsFalsy(-0.00D)); - Assert.assertTrue(BooleanUtil.isJsFalsy("")); - Assert.assertTrue(BooleanUtil.isJsFalsy(null)); - } - - @Test - public void isJsTruthyTest() { - Assert.assertTrue(BooleanUtil.isJsTruthy(true)); - Assert.assertTrue(BooleanUtil.isJsTruthy(1)); - Assert.assertTrue(BooleanUtil.isJsTruthy(-1)); - Assert.assertTrue(BooleanUtil.isJsTruthy("0")); - Assert.assertTrue(BooleanUtil.isJsTruthy("null")); - Assert.assertTrue(BooleanUtil.isJsTruthy("undefined")); - Assert.assertTrue(BooleanUtil.isJsTruthy(1L)); - Assert.assertTrue(BooleanUtil.isJsTruthy(0.1D)); - Assert.assertTrue(BooleanUtil.isJsTruthy(-0.01D)); - } } From bd83fbd973c5b09137c855e4ce0107c167ba3450 Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Wed, 15 Mar 2023 10:47:52 +0800 Subject: [PATCH 09/10] =?UTF-8?q?[enhancement]=20=E4=BD=BFLambdaFactory.bu?= =?UTF-8?q?ild=E6=94=AF=E6=8C=81=E6=9E=84=E9=80=A0=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/lang/func/LambdaFactory.java | 38 ++++++++++++------- .../core/lang/func/LambdaFactoryTest.java | 17 ++++++--- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java index 38401bc96..b3b534c90 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java @@ -7,9 +7,12 @@ import cn.hutool.core.lang.mutable.MutableEntry; import cn.hutool.core.map.WeakConcurrentMap; import cn.hutool.core.reflect.LookupFactory; import cn.hutool.core.reflect.MethodUtil; +import cn.hutool.core.reflect.ReflectUtil; import java.io.Serializable; import java.lang.invoke.*; +import java.lang.reflect.Constructor; +import java.lang.reflect.Executable; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Arrays; @@ -31,7 +34,7 @@ public class LambdaFactory { throw new IllegalAccessException(); } - private static final Map, Method>, Object> CACHE = new WeakConcurrentMap<>(); + private static final Map, Executable>, Object> CACHE = new WeakConcurrentMap<>(); /** * 构建Lambda @@ -61,30 +64,37 @@ public class LambdaFactory { * 构建Lambda * * @param functionInterfaceType 接受Lambda的函数式接口类型 - * @param method 方法对象 + * @param executable 方法对象 + * @param Function类型 * @return 接受Lambda的函数式接口对象 - * @param Function类型 */ @SuppressWarnings("unchecked") - public static F build(final Class functionInterfaceType, final Method method) { + public static F build(final Class functionInterfaceType, final Executable executable) { Assert.notNull(functionInterfaceType); - Assert.notNull(method); - final MutableEntry, Method> cacheKey = new MutableEntry<>(functionInterfaceType, method); + Assert.notNull(executable); + final MutableEntry, Executable> cacheKey = new MutableEntry<>(functionInterfaceType, executable); return (F) CACHE.computeIfAbsent(cacheKey, key -> { final List abstractMethods = Arrays.stream(functionInterfaceType.getMethods()) .filter(m -> Modifier.isAbstract(m.getModifiers())) .collect(Collectors.toList()); Assert.equals(abstractMethods.size(), 1, "不支持非函数式接口"); - if (!method.isAccessible()) { - method.setAccessible(true); - } + ReflectUtil.setAccessible(executable); final Method invokeMethod = abstractMethods.get(0); - final MethodHandles.Lookup caller = LookupFactory.lookup(method.getDeclaringClass()); + final MethodHandles.Lookup caller = LookupFactory.lookup(executable.getDeclaringClass()); final String invokeName = invokeMethod.getName(); final MethodType invokedType = methodType(functionInterfaceType); final MethodType samMethodType = methodType(invokeMethod.getReturnType(), invokeMethod.getParameterTypes()); - final MethodHandle implMethod = Opt.ofTry(() -> caller.unreflect(method)).get(); - final MethodType insMethodType = methodType(method.getReturnType(), method.getDeclaringClass(), method.getParameterTypes()); + final MethodHandle implMethod; + final MethodType instantiatedMethodType; + if (executable instanceof Method) { + final Method method = (Method) executable; + implMethod = ((SerSupplier) () -> MethodHandles.lookup().unreflect(method)).get(); + instantiatedMethodType = MethodType.methodType(method.getReturnType(), method.getDeclaringClass(), method.getParameterTypes()); + } else { + final Constructor constructor = (Constructor) executable; + implMethod = ((SerSupplier) () -> MethodHandles.lookup().unreflectConstructor(constructor)).get(); + instantiatedMethodType = MethodType.methodType(constructor.getDeclaringClass(), constructor.getParameterTypes()); + } final boolean isSerializable = Serializable.class.isAssignableFrom(functionInterfaceType); try { final CallSite callSite = isSerializable ? @@ -94,7 +104,7 @@ public class LambdaFactory { invokedType, samMethodType, implMethod, - insMethodType, + instantiatedMethodType, FLAG_SERIALIZABLE ) : LambdaMetafactory.metafactory( @@ -103,7 +113,7 @@ public class LambdaFactory { invokedType, samMethodType, implMethod, - insMethodType + instantiatedMethodType ); //noinspection unchecked return (F) callSite.getTarget().invoke(); diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaFactoryTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaFactoryTest.java index 83f65ee41..db3f68ab3 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaFactoryTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaFactoryTest.java @@ -12,11 +12,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import java.lang.invoke.LambdaConversionException; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandleProxies; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; +import java.lang.invoke.*; +import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; @@ -24,6 +21,7 @@ import java.util.Comparator; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; import java.util.function.Function; +import java.util.function.Supplier; /** * @author nasodaengineer @@ -160,6 +158,15 @@ public class LambdaFactoryTest { loop(count, tasks); } + @Test + public void testConstructor() { + Constructor constructor = ((SerSupplier>) Something.class::getConstructor).get(); + Supplier constructorLambda = LambdaFactory.build(Supplier.class, constructor); + // constructorLambda can be cache or transfer + Something something = constructorLambda.get(); + Assert.assertEquals(Something.class, something.getClass()); + } + /** *

hardCode 运行1次耗时 7600 NANOSECONDS *

lambda 运行1次耗时 12400 NANOSECONDS From 94f3920bc25e0e30081ef947d5e9bdf3f0def257 Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Wed, 15 Mar 2023 10:51:25 +0800 Subject: [PATCH 10/10] =?UTF-8?q?[enhancement]=20=E4=BD=BFLambdaFactory.bu?= =?UTF-8?q?ild=E6=94=AF=E6=8C=81=E6=9E=84=E9=80=A0=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/lang/func/LambdaFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java index b3b534c90..f425c83b2 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java @@ -64,7 +64,7 @@ public class LambdaFactory { * 构建Lambda * * @param functionInterfaceType 接受Lambda的函数式接口类型 - * @param executable 方法对象 + * @param executable 方法对象,支持构造器 * @param Function类型 * @return 接受Lambda的函数式接口对象 */