From 538874562d68b3316d7d376ecec20714ced32223 Mon Sep 17 00:00:00 2001
From: naooohu
Date: Thu, 20 Jan 2022 01:28:58 +0800
Subject: [PATCH 01/43] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E5=88=A4?=
=?UTF-8?q?=E6=96=AD=E4=B8=A4=E4=B8=AA=E6=97=A5=E6=9C=9F=E6=98=AF=E5=90=A6?=
=?UTF-8?q?=E4=B8=BA=E4=B8=80=E5=91=A8=EF=BC=88=E5=9B=BD=E5=86=85=E4=B8=80?=
=?UTF-8?q?=E5=91=A8=E7=9A=84=E5=BC=80=E5=A7=8B=E4=B8=BA=E5=91=A8=E4=B8=80?=
=?UTF-8?q?=EF=BC=8C=E5=9B=BD=E5=A4=96=E4=B8=80=E5=91=A8=E7=9A=84=E5=BC=80?=
=?UTF-8?q?=E5=A7=8B=E4=B8=BA=E5=91=A8=E6=97=A5=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cn/hutool/core/date/CalendarUtil.java | 16 +++++++++++
.../java/cn/hutool/core/date/DateUtil.java | 28 +++++++++++++++++++
.../cn/hutool/core/date/DateUtilTest.java | 11 ++++++++
3 files changed, 55 insertions(+)
diff --git a/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java
index a1e2f176b..774aabec5 100644
--- a/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java
@@ -348,6 +348,22 @@ public class CalendarUtil {
cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA);
}
+ /**
+ * 比较两个日期是否为同一周
+ *
+ * @param cal1 日期1
+ * @param cal2 日期2
+ * @return 是否为同一周
+ */
+ public static boolean isSameWeek(Calendar cal1, Calendar cal2) {
+ if (cal1 == null || cal2 == null) {
+ throw new IllegalArgumentException("The date must not be null");
+ }
+ return cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
+ cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH) &&
+ cal1.get(Calendar.DAY_OF_WEEK) == cal2.get(Calendar.DAY_OF_WEEK);
+ }
+
/**
* 比较两个日期是否为同一月
*
diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java
index 813fba971..066777c78 100644
--- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java
@@ -1586,6 +1586,34 @@ public class DateUtil extends CalendarUtil {
return CalendarUtil.isSameDay(calendar(date1), calendar(date2));
}
+ /**
+ * 比较两个日期是否为同一周
+ *
+ * @param date1 日期1
+ * @param date2 日期2
+ * @param isMon 是否为周一。国内第一天为星期一,国外第一天为星期日
+ * @return 是否为同一周
+ */
+ public static boolean isSameWeek(final Date date1, final Date date2, boolean isMon) {
+ if (date1 == null || date2 == null) {
+ throw new IllegalArgumentException("The date must not be null");
+ }
+ Calendar calendar1 = calendar(date1);
+ Calendar calendar2 = calendar(date2);
+ if (isMon) {
+ calendar1.setFirstDayOfWeek(Calendar.MONDAY);
+ calendar1.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
+ calendar2.setFirstDayOfWeek(Calendar.MONDAY);
+ calendar2.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
+ } else {
+ calendar1.setFirstDayOfWeek(Calendar.SUNDAY);
+ calendar1.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
+ calendar2.setFirstDayOfWeek(Calendar.SUNDAY);
+ calendar2.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
+ }
+ return CalendarUtil.isSameWeek(calendar1, calendar2);
+ }
+
/**
* 比较两个日期是否为同一月
*
diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java
index 24e7321a8..ceab8fe7e 100644
--- a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java
@@ -1004,4 +1004,15 @@ public class DateUtilTest {
final DateTime parse = DateUtil.parse("2021-12-01", DatePattern.NORM_DATE_FORMATTER);
Assert.assertEquals("2021-12-01 00:00:00", parse.toString());
}
+
+ @Test
+ public void test() {
+ // 周六与周日比较
+ final boolean isSameWeek = DateUtil.isSameWeek(DateTime.of("2022-01-01", "yyyy-MM-dd"), DateTime.of("2022-01-02", "yyyy-MM-dd"), true);
+ Assert.assertTrue(isSameWeek);
+ // 周日与周一比较
+ final boolean isSameWeek1 = DateUtil.isSameWeek(DateTime.of("2022-01-02", "yyyy-MM-dd"), DateTime.of("2022-01-03", "yyyy-MM-dd"), false);
+ Assert.assertTrue(isSameWeek1);
+
+ }
}
From 4447bb18d420c9e5b36e50485a2502b99b7865ec Mon Sep 17 00:00:00 2001
From: tjh
Date: Thu, 20 Jan 2022 16:28:08 +0800
Subject: [PATCH 02/43] =?UTF-8?q?=E6=96=B0=EF=BC=9A=E6=96=B0=E5=A2=9E?=
=?UTF-8?q?=E6=9D=A1=E4=BB=B6=E7=BB=84=EF=BC=8C=E7=94=A8=E4=BA=8E=E5=A4=84?=
=?UTF-8?q?=E7=90=86=E5=A4=8D=E6=9D=82=E7=9A=84where=E6=9D=A1=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/cn/hutool/db/sql/ConditionGroup.java | 51 +++++++++++++++++++
.../cn/hutool/db/sql/ConditionGroupTest.java | 26 ++++++++++
2 files changed, 77 insertions(+)
create mode 100644 hutool-db/src/main/java/cn/hutool/db/sql/ConditionGroup.java
create mode 100644 hutool-db/src/test/java/cn/hutool/db/sql/ConditionGroupTest.java
diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/ConditionGroup.java b/hutool-db/src/main/java/cn/hutool/db/sql/ConditionGroup.java
new file mode 100644
index 000000000..33467287a
--- /dev/null
+++ b/hutool-db/src/main/java/cn/hutool/db/sql/ConditionGroup.java
@@ -0,0 +1,51 @@
+package cn.hutool.db.sql;
+
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.StrUtil;
+
+import java.util.List;
+
+/**
+ * 条件组
+ * 用于构建复杂where条件
+ *
+ * @author tjh
+ */
+public class ConditionGroup extends Condition{
+ /**
+ * 条件列表
+ */
+ private Condition[] conditions;
+
+ /**
+ * 追加条件
+ *
+ * @param conditions 条件列表
+ */
+ public void addConditions(Condition... conditions) {
+ if(null == this.conditions) {
+ this.conditions = conditions;
+ } else {
+ this.conditions = ArrayUtil.addAll(this.conditions, conditions);
+ }
+ }
+
+ /**
+ * 将条件组转换为条件字符串,使用括号包裹,并回填占位符对应的参数值
+ *
+ * @param paramValues 参数列表,用于回填占位符对应参数值
+ * @return 条件字符串
+ */
+ @Override
+ public String toString(List
*
* @author TomXin
- * @since jdk1.8
+ * @since 5.7.21
*/
public class GenericBuilder implements Builder {
/**
* 实例化器
*/
- private final Supplier instantiator;
+ private final Supplier instant;
/**
* 修改器列表
@@ -64,7 +75,7 @@ public class GenericBuilder implements Builder {
* @param instant 实例化器
*/
public GenericBuilder(Supplier instant) {
- this.instantiator = instant;
+ this.instant = instant;
}
/**
@@ -88,8 +99,7 @@ public class GenericBuilder implements Builder {
* @return GenericBuilder对象
*/
public static GenericBuilder of(Supplier1 instant, P1 p1) {
- Supplier s = () -> instant.get(p1);
- return new GenericBuilder<>(s);
+ return of(instant.toSupplier(p1));
}
/**
@@ -104,8 +114,7 @@ public class GenericBuilder implements Builder {
* @return GenericBuilder对象
*/
public static GenericBuilder of(Supplier2 instant, P1 p1, P2 p2) {
- Supplier s = () -> instant.get(p1, p2);
- return new GenericBuilder<>(s);
+ return of(instant.toSupplier(p1, p2));
}
/**
@@ -122,8 +131,7 @@ public class GenericBuilder implements Builder {
* @return GenericBuilder对象
*/
public static GenericBuilder of(Supplier3 instant, P1 p1, P2 p2, P3 p3) {
- Supplier s = () -> instant.get(p1, p2, p3);
- return new GenericBuilder<>(s);
+ return of(instant.toSupplier(p1, p2, p3));
}
/**
@@ -142,8 +150,7 @@ public class GenericBuilder implements Builder {
* @return GenericBuilder对象
*/
public static GenericBuilder of(Supplier4 instant, P1 p1, P2 p2, P3 p3, P4 p4) {
- Supplier s = () -> instant.get(p1, p2, p3, p4);
- return new GenericBuilder<>(s);
+ return of(instant.toSupplier(p1, p2, p3, p4));
}
/**
@@ -164,8 +171,7 @@ public class GenericBuilder implements Builder {
* @return GenericBuilder对象
*/
public static GenericBuilder of(Supplier5 instant, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
- Supplier s = () -> instant.get(p1, p2, p3, p4, p5);
- return new GenericBuilder<>(s);
+ return of(instant.toSupplier(p1, p2, p3, p4, p5));
}
@@ -190,8 +196,7 @@ public class GenericBuilder implements Builder {
* @return GenericBuilder对象
*/
public GenericBuilder with(Consumer1 consumer, P1 p1) {
- Consumer c = instance -> consumer.accept(instance, p1);
- modifiers.add(c);
+ modifiers.add(consumer.toConsumer(p1));
return this;
}
@@ -206,8 +211,7 @@ public class GenericBuilder implements Builder {
* @return GenericBuilder对象
*/
public GenericBuilder with(Consumer2 consumer, P1 p1, P2 p2) {
- Consumer c = instance -> consumer.accept(instance, p1, p2);
- modifiers.add(c);
+ modifiers.add(consumer.toConsumer(p1, p2));
return this;
}
@@ -224,8 +228,7 @@ public class GenericBuilder implements Builder {
* @return GenericBuilder对象
*/
public GenericBuilder with(Consumer3 consumer, P1 p1, P2 p2, P3 p3) {
- Consumer c = instance -> consumer.accept(instance, p1, p2, p3);
- modifiers.add(c);
+ modifiers.add(consumer.toConsumer(p1, p2, p3));
return this;
}
@@ -244,8 +247,7 @@ public class GenericBuilder implements Builder {
* @return GenericBuilder对象
*/
public GenericBuilder with(Consumer4 consumer, P1 p1, P2 p2, P3 p3, P4 p4) {
- Consumer c = instance -> consumer.accept(instance, p1, p2, p3, p4);
- modifiers.add(c);
+ modifiers.add(consumer.toConsumer(p1, p2, p3, p4));
return this;
}
@@ -266,8 +268,7 @@ public class GenericBuilder implements Builder {
* @return GenericBuilder对象
*/
public GenericBuilder with(Consumer5 consumer, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
- Consumer c = instance -> consumer.accept(instance, p1, p2, p3, p4, p5);
- modifiers.add(c);
+ modifiers.add(consumer.toConsumer(p1, p2, p3, p4, p5));
return this;
}
@@ -278,201 +279,9 @@ public class GenericBuilder implements Builder {
*/
@Override
public T build() {
- T value = instantiator.get();
+ T value = instant.get();
modifiers.forEach(modifier -> modifier.accept(value));
modifiers.clear();
return value;
}
-
-
- /**
- * 1参数Supplier
- *
- * @param 目标类型
- * @param 参数一类型
- */
- @FunctionalInterface
- public interface Supplier1 {
- /**
- * 生成实例的方法
- *
- * @param p1 参数一
- * @return 目标对象
- */
- T get(P1 p1);
- }
-
-
- /**
- * 2参数Supplier
- *
- * @param 目标类型
- * @param 参数一类型
- * @param 参数二类型
- */
- @FunctionalInterface
- public interface Supplier2 {
-
- /**
- * 生成实例的方法
- *
- * @param p1 参数一
- * @param p2 参数二
- * @return 目标对象
- */
- T get(P1 p1, P2 p2);
- }
-
- /**
- * 3参数Supplier
- *
- * @param 目标类型
- * @param 参数一类型
- * @param 参数二类型
- * @param 参数三类型
- */
- @FunctionalInterface
- public interface Supplier3 {
-
- /**
- * 生成实例的方法
- *
- * @param p1 参数一
- * @param p2 参数二
- * @param p3 参数三
- * @return 目标对象
- */
- T get(P1 p1, P2 p2, P3 p3);
- }
-
-
- /**
- * 4参数Supplier
- *
- * @param 目标类型
- * @param 参数一类型
- * @param 参数二类型
- * @param 参数三类型
- * @param 参数四类型
- */
- @FunctionalInterface
- public interface Supplier4 {
-
- /**
- * 生成实例的方法
- *
- * @param p1 参数一
- * @param p2 参数二
- * @param p3 参数三
- * @param p4 参数四
- * @return 目标对象
- */
- T get(P1 p1, P2 p2, P3 p3, P4 p4);
- }
-
- /**
- * 5参数Supplier
- *
- * @param 目标类型
- * @param 参数一类型
- * @param 参数二类型
- * @param 参数三类型
- * @param 参数四类型
- * @param 参数五类型
- */
- @FunctionalInterface
- public interface Supplier5 {
-
- /**
- * 生成实例的方法
- *
- * @param p1 参数一
- * @param p2 参数二
- * @param p3 参数三
- * @param p4 参数四
- * @param p5 参数五
- * @return 目标对象
- */
- T get(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5);
- }
-
- /**
- * 1参数Consumer
- */
- @FunctionalInterface
- public interface Consumer1 {
- /**
- * 接收参数方法
- *
- * @param t 对象
- * @param p1 参数二
- */
- void accept(T t, P1 p1);
- }
-
- /**
- * 2参数Consumer
- */
- @FunctionalInterface
- public interface Consumer2 {
- /**
- * 接收参数方法
- *
- * @param t 对象
- * @param p1 参数一
- * @param p2 参数二
- */
- void accept(T t, P1 p1, P2 p2);
- }
-
- /**
- * 3参数Consumer
- */
- @FunctionalInterface
- public interface Consumer3 {
- /**
- * 接收参数方法
- *
- * @param t 对象
- * @param p1 参数一
- * @param p2 参数二
- * @param p3 参数三
- */
- void accept(T t, P1 p1, P2 p2, P3 p3);
- }
-
- /**
- * 4参数Consumer
- */
- @FunctionalInterface
- public interface Consumer4 {
- /**
- * 接收参数方法
- *
- * @param t 对象
- * @param p1 参数一
- * @param p2 参数二
- * @param p3 参数三
- * @param p4 参数四
- */
- void accept(T t, P1 p1, P2 p2, P3 p3, P4 p4);
- }
-
- /**
- * 5参数Consumer
- */
- @FunctionalInterface
- public interface Consumer5 {
- /**
- * 接收参数方法
- *
- * @param t 对象
- * @param p1 参数一
- * @param p2 参数二
- * @param p3 参数三
- * @param p4 参数四
- * @param p5 参数五
- */
- void accept(T t, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5);
- }
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/exceptions/CheckedUtil.java b/hutool-core/src/main/java/cn/hutool/core/exceptions/CheckedUtil.java
index 876dd0814..f1380a2d0 100644
--- a/hutool-core/src/main/java/cn/hutool/core/exceptions/CheckedUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/exceptions/CheckedUtil.java
@@ -51,7 +51,7 @@ public class CheckedUtil {
* @param expression Lambda表达式
* @param 运行时传入的参数类型
* @param 最终返回的数据类型
- * @return cn.hutool.core.lang.func.Func
+ * @return {@link FuncRt}
*/
public static FuncRt
uncheck(Func
expression) {
return uncheck(expression, new RuntimeException());
@@ -63,7 +63,7 @@ public class CheckedUtil {
*
* @param expression 运行时传入的参数类型
* @param 最终返回的数据类型
- * @return cn.hutool.core.lang.func.Func0
+ * @return {@link Func0Rt}
*/
public static Func0Rt uncheck(Func0 expression) {
return uncheck(expression, new RuntimeException());
@@ -76,7 +76,7 @@ public class CheckedUtil {
* @param expression 运行时传入的参数类型
* @param 运行时传入的参数类型
* @param 最终返回的数据类型
- * @return cn.hutool.core.lang.func.Func1
+ * @return {@link Func1Rt}
*/
public static Func1Rt
uncheck(Func1
expression) {
return uncheck(expression, new RuntimeException());
@@ -89,7 +89,7 @@ public class CheckedUtil {
*
* @param expression 运行时传入的参数类型
* @param
运行时传入的参数类型
- * @return cn.hutool.core.lang.func.VoidFunc
+ * @return {@link VoidFuncRt}
*/
public static
VoidFuncRt
uncheck(VoidFunc
expression) {
return uncheck(expression, new RuntimeException());
@@ -100,7 +100,7 @@ public class CheckedUtil {
* 如此一来,代码中就不用显示的try-catch转化成运行时异常
*
* @param expression 运行时传入的参数类型
- * @return cn.hutool.core.lang.func.VoidFunc0
+ * @return {@link VoidFunc0Rt}
*/
public static VoidFunc0Rt uncheck(VoidFunc0 expression) {
return uncheck(expression, new RuntimeException());
@@ -112,7 +112,7 @@ public class CheckedUtil {
*
* @param expression 运行时传入的参数类型
* @param
运行时传入的参数类型
- * @return cn.hutool.core.lang.func.VoidFunc1
+ * @return {@link VoidFunc1Rt}
*/
public static
VoidFunc1Rt
uncheck(VoidFunc1
expression) {
return uncheck(expression, new RuntimeException());
@@ -127,7 +127,7 @@ public class CheckedUtil {
* @param rte 期望抛出的运行时异常
* @param
运行时传入的参数类型
* @param 最终返回的数据类型
- * @return cn.hutool.core.lang.func.Func
+ * @return {@link FuncRt}
*/
public static FuncRt
uncheck(Func
expression, RuntimeException rte) {
Objects.requireNonNull(expression, "expression can not be null");
@@ -152,7 +152,7 @@ public class CheckedUtil {
* @param expression Lambda表达式
* @param rte 期望抛出的运行时异常
* @param 最终返回的数据类型
- * @return cn.hutool.core.lang.func.Func0
+ * @return {@link Func0Rt}
*/
public static Func0Rt uncheck(Func0 expression, RuntimeException rte) {
Objects.requireNonNull(expression, "expression can not be null");
@@ -178,7 +178,7 @@ public class CheckedUtil {
* @param rte 期望抛出的运行时异常
* @param 运行时传入的参数类型
* @param 最终返回的数据类型
- * @return cn.hutool.core.lang.func.Func1
+ * @return {@link Func1Rt}
*/
public static Func1Rt
uncheck(Func1
expression, RuntimeException rte) {
Objects.requireNonNull(expression, "expression can not be null");
@@ -203,7 +203,7 @@ public class CheckedUtil {
* @param expression Lambda表达式
* @param rte 期望抛出的运行时异常
* @param
运行时传入的参数类型
- * @return cn.hutool.core.lang.func.VoidFunc
+ * @return {@link VoidFuncRt}
*/
public static
VoidFuncRt
uncheck(VoidFunc
expression, RuntimeException rte) {
Objects.requireNonNull(expression, "expression can not be null");
@@ -228,7 +228,7 @@ public class CheckedUtil {
*
* @param expression Lambda表达式
* @param rte 期望抛出的运行时异常
- * @return cn.hutool.core.lang.func.VoidFunc0
+ * @return {@link VoidFunc0Rt}
*/
public static VoidFunc0Rt uncheck(VoidFunc0 expression, RuntimeException rte) {
Objects.requireNonNull(expression, "expression can not be null");
@@ -254,7 +254,7 @@ public class CheckedUtil {
* @param expression Lambda表达式
* @param rte 期望抛出的运行时异常
* @param
运行时传入的参数类型
- * @return cn.hutool.core.lang.func.VoidFunc1
+ * @return {@link VoidFunc1Rt}
*/
public static
VoidFunc1Rt
uncheck(VoidFunc1
expression, RuntimeException rte) {
Objects.requireNonNull(expression, "expression can not be null");
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer1.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer1.java
new file mode 100755
index 000000000..12d4b3893
--- /dev/null
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer1.java
@@ -0,0 +1,32 @@
+package cn.hutool.core.lang.func;
+
+import java.util.function.Consumer;
+
+/**
+ * 1参数Consumer
+ *
+ * @param 目标类型
+ * @param 参数一类型
+ * @author TomXin
+ * @since 5.7.21
+ */
+@FunctionalInterface
+public interface Consumer1 {
+ /**
+ * 接收参数方法
+ *
+ * @param t 对象
+ * @param p1 参数1
+ */
+ void accept(T t, P1 p1);
+
+ /**
+ * 将带有参数的Consumer转换为无参{@link Consumer}
+ *
+ * @param p1 参数1
+ * @return {@link Consumer}
+ */
+ default Consumer toConsumer(P1 p1) {
+ return instant -> accept(instant, p1);
+ }
+}
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer2.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer2.java
new file mode 100755
index 000000000..82c1ea43f
--- /dev/null
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer2.java
@@ -0,0 +1,36 @@
+package cn.hutool.core.lang.func;
+
+import java.util.function.Consumer;
+
+/**
+ * 2参数Consumer
+ *
+ * @param 目标类型
+ * @param 参数一类型
+ * @param 参数二类型
+ * @author TomXin
+ * @since 5.7.21
+ */
+@FunctionalInterface
+public interface Consumer2 {
+
+ /**
+ * 接收参数方法
+ *
+ * @param t 对象
+ * @param p1 参数一
+ * @param p2 参数二
+ */
+ void accept(T t, P1 p1, P2 p2);
+
+ /**
+ * 将带有参数的Consumer转换为无参{@link Consumer}
+ *
+ * @param p1 参数1
+ * @param p2 参数2
+ * @return {@link Consumer}
+ */
+ default Consumer toConsumer(P1 p1, P2 p2) {
+ return instant -> accept(instant, p1, p2);
+ }
+}
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer3.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer3.java
new file mode 100755
index 000000000..2f5b2eb57
--- /dev/null
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer3.java
@@ -0,0 +1,38 @@
+package cn.hutool.core.lang.func;
+
+import java.util.function.Consumer;
+
+/**
+ * 3参数Consumer
+ *
+ * @param 目标类型
+ * @param 参数一类型
+ * @param 参数二类型
+ * @param 参数三类型
+ * @author TomXin
+ * @since 5.7.21
+ */
+@FunctionalInterface
+public interface Consumer3 {
+ /**
+ * 接收参数方法
+ *
+ * @param t 对象
+ * @param p1 参数一
+ * @param p2 参数二
+ * @param p3 参数三
+ */
+ void accept(T t, P1 p1, P2 p2, P3 p3);
+
+ /**
+ * 将带有参数的Consumer转换为无参{@link Consumer}
+ *
+ * @param p1 参数1
+ * @param p2 参数2
+ * @param p3 参数3
+ * @return {@link Consumer}
+ */
+ default Consumer toConsumer(P1 p1, P2 p2, P3 p3) {
+ return instant -> accept(instant, p1, p2, p3);
+ }
+}
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer4.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer4.java
new file mode 100755
index 000000000..59cd66c1e
--- /dev/null
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer4.java
@@ -0,0 +1,41 @@
+package cn.hutool.core.lang.func;
+
+import java.util.function.Consumer;
+
+/**
+ * 4参数Consumer
+ *
+ * @param 目标类型
+ * @param 参数一类型
+ * @param 参数二类型
+ * @param 参数三类型
+ * @param 参数四类型
+ * @author TomXin
+ * @since 5.7.21
+ */
+@FunctionalInterface
+public interface Consumer4 {
+ /**
+ * 接收参数方法
+ *
+ * @param t 对象
+ * @param p1 参数一
+ * @param p2 参数二
+ * @param p3 参数三
+ * @param p4 参数四
+ */
+ void accept(T t, P1 p1, P2 p2, P3 p3, P4 p4);
+
+ /**
+ * 将带有参数的Consumer转换为无参{@link Consumer}
+ *
+ * @param p1 参数1
+ * @param p2 参数2
+ * @param p3 参数3
+ * @param p4 参数4
+ * @return {@link Consumer}
+ */
+ default Consumer toConsumer(P1 p1, P2 p2, P3 p3, P4 p4) {
+ return instant -> accept(instant, p1, p2, p3, p4);
+ }
+}
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer5.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer5.java
new file mode 100755
index 000000000..be18f3e1f
--- /dev/null
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer5.java
@@ -0,0 +1,44 @@
+package cn.hutool.core.lang.func;
+
+import java.util.function.Consumer;
+
+/**
+ * 5参数Consumer
+ *
+ * @param 目标 类型
+ * @param 参数一 类型
+ * @param 参数二 类型
+ * @param 参数三 类型
+ * @param 参数四 类型
+ * @param 参数五 类型
+ * @author TomXin
+ * @since 5.7.21
+ */
+@FunctionalInterface
+public interface Consumer5 {
+ /**
+ * 接收参数方法
+ *
+ * @param t 对象
+ * @param p1 参数一
+ * @param p2 参数二
+ * @param p3 参数三
+ * @param p4 参数四
+ * @param p5 参数五
+ */
+ void accept(T t, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5);
+
+ /**
+ * 将带有参数的Consumer转换为无参{@link Consumer}
+ *
+ * @param p1 参数1
+ * @param p2 参数2
+ * @param p3 参数3
+ * @param p4 参数4
+ * @param p5 参数5
+ * @return {@link Consumer}
+ */
+ default Consumer toConsumer(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
+ return instant -> accept(instant, p1, p2, p3, p4, p5);
+ }
+}
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Supplier1.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Supplier1.java
new file mode 100755
index 000000000..376c91a2a
--- /dev/null
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/Supplier1.java
@@ -0,0 +1,32 @@
+package cn.hutool.core.lang.func;
+
+import java.util.function.Supplier;
+
+/**
+ * 1参数Supplier
+ *
+ * @param 目标 类型
+ * @param 参数一 类型
+ * @author TomXin
+ * @since 5.7.21
+ */
+@FunctionalInterface
+public interface Supplier1 {
+ /**
+ * 生成实例的方法
+ *
+ * @param p1 参数一
+ * @return 目标对象
+ */
+ T get(P1 p1);
+
+ /**
+ * 将带有参数的Supplier转换为无参{@link Supplier}
+ *
+ * @param p1 参数1
+ * @return {@link Supplier}
+ */
+ default Supplier toSupplier(P1 p1) {
+ return () -> get(p1);
+ }
+}
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Supplier2.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Supplier2.java
new file mode 100755
index 000000000..6d5e9ce80
--- /dev/null
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/Supplier2.java
@@ -0,0 +1,36 @@
+package cn.hutool.core.lang.func;
+
+import java.util.function.Supplier;
+
+/**
+ * 两个参数的Supplier
+ *
+ * @param 目标 类型
+ * @param 参数一 类型
+ * @param 参数二 类型
+ * @author TomXin
+ * @since 5.7.21
+ */
+@FunctionalInterface
+public interface Supplier2 {
+
+ /**
+ * 生成实例的方法
+ *
+ * @param p1 参数一
+ * @param p2 参数二
+ * @return 目标对象
+ */
+ T get(P1 p1, P2 p2);
+
+ /**
+ * 将带有参数的Supplier转换为无参{@link Supplier}
+ *
+ * @param p1 参数1
+ * @param p2 参数2
+ * @return {@link Supplier}
+ */
+ default Supplier toSupplier(P1 p1, P2 p2) {
+ return () -> get(p1, p2);
+ }
+}
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Supplier3.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Supplier3.java
new file mode 100755
index 000000000..50324e55b
--- /dev/null
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/Supplier3.java
@@ -0,0 +1,39 @@
+package cn.hutool.core.lang.func;
+
+import java.util.function.Supplier;
+
+/**
+ * 3参数Supplier
+ *
+ * @param 目标类型
+ * @param 参数一类型
+ * @param 参数二类型
+ * @param 参数三类型
+ * @author TomXin
+ * @since 5.7.21
+ */
+@FunctionalInterface
+public interface Supplier3 {
+
+ /**
+ * 生成实例的方法
+ *
+ * @param p1 参数一
+ * @param p2 参数二
+ * @param p3 参数三
+ * @return 目标对象
+ */
+ T get(P1 p1, P2 p2, P3 p3);
+
+ /**
+ * 将带有参数的Supplier转换为无参{@link Supplier}
+ *
+ * @param p1 参数1
+ * @param p2 参数2
+ * @param p3 参数3
+ * @return {@link Supplier}
+ */
+ default Supplier toSupplier(P1 p1, P2 p2, P3 p3) {
+ return () -> get(p1, p2, p3);
+ }
+}
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Supplier4.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Supplier4.java
new file mode 100755
index 000000000..c715b8693
--- /dev/null
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/Supplier4.java
@@ -0,0 +1,42 @@
+package cn.hutool.core.lang.func;
+
+import java.util.function.Supplier;
+
+/**
+ * 4参数Supplier
+ *
+ * @param 目标 类型
+ * @param 参数一 类型
+ * @param 参数二 类型
+ * @param 参数三 类型
+ * @param 参数四 类型
+ * @author TomXin
+ * @since 5.7.21
+ */
+@FunctionalInterface
+public interface Supplier4 {
+
+ /**
+ * 生成实例的方法
+ *
+ * @param p1 参数一
+ * @param p2 参数二
+ * @param p3 参数三
+ * @param p4 参数四
+ * @return 目标对象
+ */
+ T get(P1 p1, P2 p2, P3 p3, P4 p4);
+
+ /**
+ * 将带有参数的Supplier转换为无参{@link Supplier}
+ *
+ * @param p1 参数1
+ * @param p2 参数2
+ * @param p3 参数3
+ * @param p4 参数4
+ * @return {@link Supplier}
+ */
+ default Supplier toSupplier(P1 p1, P2 p2, P3 p3, P4 p4) {
+ return () -> get(p1, p2, p3, p4);
+ }
+}
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Supplier5.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Supplier5.java
new file mode 100755
index 000000000..121a2ce9c
--- /dev/null
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/Supplier5.java
@@ -0,0 +1,45 @@
+package cn.hutool.core.lang.func;
+
+import java.util.function.Supplier;
+
+/**
+ * 5参数Supplier
+ *
+ * @param 目标 类型
+ * @param 参数一 类型
+ * @param 参数二 类型
+ * @param 参数三 类型
+ * @param 参数四 类型
+ * @param 参数五 类型
+ * @author TomXin
+ * @since 5.7.21
+ */
+@FunctionalInterface
+public interface Supplier5 {
+
+ /**
+ * 生成实例的方法
+ *
+ * @param p1 参数一
+ * @param p2 参数二
+ * @param p3 参数三
+ * @param p4 参数四
+ * @param p5 参数五
+ * @return 目标对象
+ */
+ T get(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5);
+
+ /**
+ * 将带有参数的Supplier转换为无参{@link Supplier}
+ *
+ * @param p1 参数1
+ * @param p2 参数2
+ * @param p3 参数3
+ * @param p4 参数4
+ * @param p5 参数5
+ * @return {@link Supplier}
+ */
+ default Supplier toSupplier(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
+ return () -> get(p1, p2, p3, p4, p5);
+ }
+}
diff --git a/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java b/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java
index b3753e62d..f5c8c9732 100644
--- a/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java
@@ -2,6 +2,7 @@ package cn.hutool.core.builder;
import cn.hutool.core.util.StrUtil;
import lombok.*;
+import org.junit.Assert;
import org.junit.Test;
/**
@@ -21,7 +22,13 @@ public class GenericBuilderTest {
.with(Box::setWidth, 8)
.with(Box::setHeight, 7)
.build();
- System.out.println(box);
+
+ Assert.assertEquals(1024L, box.getId().longValue());
+ Assert.assertEquals("Hello World!", box.getTitle());
+ Assert.assertEquals(9, box.getLength().intValue());
+ Assert.assertEquals(8, box.getWidth().intValue());
+ Assert.assertEquals(7, box.getHeight().intValue());
+
Box boxModified = GenericBuilder
.of(() -> box)
.with(Box::setTitle, "Hello Friend!")
@@ -29,12 +36,23 @@ public class GenericBuilderTest {
.with(Box::setWidth, 4)
.with(Box::setHeight, 5)
.build();
- System.out.println(boxModified);
+
+ Assert.assertEquals(1024L, boxModified.getId().longValue());
+ Assert.assertEquals("Hello Friend!", box.getTitle());
+ Assert.assertEquals(3, boxModified.getLength().intValue());
+ Assert.assertEquals(4, boxModified.getWidth().intValue());
+ Assert.assertEquals(5, boxModified.getHeight().intValue());
+
Box box1 = GenericBuilder
.of(Box::new, 2048L, "Hello Partner!", 222, 333, 444)
.with(Box::alis)
.build();
- System.out.println(box1);
+
+ Assert.assertEquals(2048L, box1.getId().longValue());
+ Assert.assertEquals("Hello Partner!", box1.getTitle());
+ Assert.assertEquals(222, box1.getLength().intValue());
+ Assert.assertEquals(333, box1.getWidth().intValue());
+ Assert.assertEquals(444, box1.getHeight().intValue());
}
@Getter
diff --git a/hutool-core/src/test/java/cn/hutool/core/exceptions/CheckedUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/exceptions/CheckedUtilTest.java
index fbfe82cb2..35be0f241 100644
--- a/hutool-core/src/test/java/cn/hutool/core/exceptions/CheckedUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/exceptions/CheckedUtilTest.java
@@ -21,11 +21,8 @@ public class CheckedUtilTest {
@Test
public void sleepTest() {
-
VoidFunc0 func = () -> Thread.sleep(1000L);
func.callWithRuntimeException();
-
-
}
@@ -39,7 +36,6 @@ public class CheckedUtilTest {
} catch (Exception re) {
Assert.assertTrue(re instanceof RuntimeException);
}
-
}
@SuppressWarnings("ConstantConditions")
From d10879c5e98c9b41d285da5726bb0aec5d01f0bc Mon Sep 17 00:00:00 2001
From: Looly
Date: Mon, 7 Feb 2022 11:01:35 +0800
Subject: [PATCH 39/43] fix code
---
.../cn/hutool/json/serialize/JSONWriter.java | 22 ++++++-------------
1 file changed, 7 insertions(+), 15 deletions(-)
diff --git a/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java b/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java
index c57ef2488..3d6024387 100755
--- a/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java
+++ b/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java
@@ -249,22 +249,20 @@ public class JSONWriter extends Writer {
* 此方法输出的值不包装引号。
*
* @param number 数字
- * @return this
*/
- private JSONWriter writeNumberValue(Number number) {
+ private void writeNumberValue(Number number) {
// since 5.6.2可配置是否去除末尾多余0,例如如果为true,5.0返回5
final boolean isStripTrailingZeros = null == config || config.isStripTrailingZeros();
- return writeRaw(NumberUtil.toStr(number, isStripTrailingZeros));
+ writeRaw(NumberUtil.toStr(number, isStripTrailingZeros));
}
/**
* 写出Boolean值,直接写出true或false,不适用引号包装
*
* @param value Boolean值
- * @return this
*/
- private JSONWriter writeBooleanValue(Boolean value) {
- return writeRaw(value.toString());
+ private void writeBooleanValue(Boolean value) {
+ writeRaw(value.toString());
}
/**
@@ -273,9 +271,8 @@ public class JSONWriter extends Writer {
* 如果toJSONString()返回null,调用toString()方法并使用双引号包装。
*
* @param jsonString {@link JSONString}
- * @return this
*/
- private JSONWriter writeJSONStringValue(JSONString jsonString) {
+ private void writeJSONStringValue(JSONString jsonString) {
String valueStr;
try {
valueStr = jsonString.toJSONString();
@@ -287,7 +284,6 @@ public class JSONWriter extends Writer {
} else {
writeStrValue(jsonString.toString());
}
- return this;
}
/**
@@ -297,30 +293,26 @@ public class JSONWriter extends Writer {
* JSON字符串中不能包含控制字符和未经转义的引号和反斜杠
*
* @param csq 字符串
- * @return this
*/
- private JSONWriter writeStrValue(String csq) {
+ private void writeStrValue(String csq) {
try {
JSONUtil.quote(csq, writer);
} catch (IOException e) {
throw new IORuntimeException(e);
}
- return this;
}
/**
* 写出空格
*
* @param count 空格数
- * @return this
*/
- private JSONWriter writeSpace(int count) {
+ private void writeSpace(int count) {
if (indentFactor > 0) {
for (int i = 0; i < count; i++) {
writeRaw(CharUtil.SPACE);
}
}
- return this;
}
/**
From a547909d5ed3369e128280e7d1fd9418f771e93b Mon Sep 17 00:00:00 2001
From: Looly
Date: Mon, 7 Feb 2022 17:00:14 +0800
Subject: [PATCH 40/43] fix code
---
.../hutool/core/builder/GenericBuilder.java | 86 ++-----------------
.../cn/hutool/core/lang/func/Consumer1.java | 32 -------
.../cn/hutool/core/lang/func/Consumer2.java | 36 --------
.../cn/hutool/core/lang/func/Consumer3.java | 38 --------
.../cn/hutool/core/lang/func/Consumer4.java | 41 ---------
.../cn/hutool/core/lang/func/Consumer5.java | 44 ----------
.../core/builder/GenericBuilderTest.java | 6 +-
7 files changed, 10 insertions(+), 273 deletions(-)
delete mode 100755 hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer1.java
delete mode 100755 hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer2.java
delete mode 100755 hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer3.java
delete mode 100755 hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer4.java
delete mode 100755 hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer5.java
diff --git a/hutool-core/src/main/java/cn/hutool/core/builder/GenericBuilder.java b/hutool-core/src/main/java/cn/hutool/core/builder/GenericBuilder.java
index 4d4de0de5..c821ac4b2 100644
--- a/hutool-core/src/main/java/cn/hutool/core/builder/GenericBuilder.java
+++ b/hutool-core/src/main/java/cn/hutool/core/builder/GenericBuilder.java
@@ -1,10 +1,5 @@
package cn.hutool.core.builder;
-import cn.hutool.core.lang.func.Consumer1;
-import cn.hutool.core.lang.func.Consumer2;
-import cn.hutool.core.lang.func.Consumer3;
-import cn.hutool.core.lang.func.Consumer4;
-import cn.hutool.core.lang.func.Consumer5;
import cn.hutool.core.lang.func.Supplier1;
import cn.hutool.core.lang.func.Supplier2;
import cn.hutool.core.lang.func.Supplier3;
@@ -13,6 +8,7 @@ import cn.hutool.core.lang.func.Supplier5;
import java.util.ArrayList;
import java.util.List;
+import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Supplier;
@@ -190,85 +186,13 @@ public class GenericBuilder implements Builder {
/**
* 调用1参数方法
*
- * @param consumer 1参数Consumer
- * @param p1 参数一
* @param 参数一类型
+ * @param consumer 1参数Consumer,一般为Setter方法引用
+ * @param p1 参数一
* @return GenericBuilder对象
*/
- public GenericBuilder with(Consumer1 consumer, P1 p1) {
- modifiers.add(consumer.toConsumer(p1));
- return this;
- }
-
- /**
- * 调用2参数方法
- *
- * @param consumer 2参数Consumer
- * @param p1 参数一
- * @param p2 参数二
- * @param 参数一类型
- * @param 参数二类型
- * @return GenericBuilder对象
- */
- public GenericBuilder with(Consumer2 consumer, P1 p1, P2 p2) {
- modifiers.add(consumer.toConsumer(p1, p2));
- return this;
- }
-
- /**
- * 调用3参数方法
- *
- * @param consumer 3参数Consumer
- * @param p1 参数一
- * @param p2 参数二
- * @param p3 参数三
- * @param 参数一类型
- * @param 参数二类型
- * @param 参数三类型
- * @return GenericBuilder对象
- */
- public GenericBuilder with(Consumer3 consumer, P1 p1, P2 p2, P3 p3) {
- modifiers.add(consumer.toConsumer(p1, p2, p3));
- return this;
- }
-
- /**
- * 调用4参数方法
- *
- * @param consumer 4参数Consumer
- * @param p1 参数一
- * @param p2 参数二
- * @param p3 参数三
- * @param p4 参数四
- * @param 参数一类型
- * @param 参数二类型
- * @param 参数三类型
- * @param 参数四类型
- * @return GenericBuilder对象
- */
- public GenericBuilder with(Consumer4 consumer, P1 p1, P2 p2, P3 p3, P4 p4) {
- modifiers.add(consumer.toConsumer(p1, p2, p3, p4));
- return this;
- }
-
- /**
- * 调用5参数方法
- *
- * @param consumer 5参数Consumer
- * @param p1 参数一
- * @param p2 参数二
- * @param p3 参数三
- * @param p4 参数四
- * @param p5 参数五
- * @param 参数一类型
- * @param 参数二类型
- * @param 参数三类型
- * @param 参数四类型
- * @param 参数五类型
- * @return GenericBuilder对象
- */
- public GenericBuilder with(Consumer5 consumer, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
- modifiers.add(consumer.toConsumer(p1, p2, p3, p4, p5));
+ public GenericBuilder with(BiConsumer consumer, P1 p1) {
+ modifiers.add(instant -> consumer.accept(instant, p1));
return this;
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer1.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer1.java
deleted file mode 100755
index 12d4b3893..000000000
--- a/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package cn.hutool.core.lang.func;
-
-import java.util.function.Consumer;
-
-/**
- * 1参数Consumer
- *
- * @param 目标类型
- * @param 参数一类型
- * @author TomXin
- * @since 5.7.21
- */
-@FunctionalInterface
-public interface Consumer1 {
- /**
- * 接收参数方法
- *
- * @param t 对象
- * @param p1 参数1
- */
- void accept(T t, P1 p1);
-
- /**
- * 将带有参数的Consumer转换为无参{@link Consumer}
- *
- * @param p1 参数1
- * @return {@link Consumer}
- */
- default Consumer toConsumer(P1 p1) {
- return instant -> accept(instant, p1);
- }
-}
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer2.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer2.java
deleted file mode 100755
index 82c1ea43f..000000000
--- a/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer2.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package cn.hutool.core.lang.func;
-
-import java.util.function.Consumer;
-
-/**
- * 2参数Consumer
- *
- * @param 目标类型
- * @param 参数一类型
- * @param 参数二类型
- * @author TomXin
- * @since 5.7.21
- */
-@FunctionalInterface
-public interface Consumer2 {
-
- /**
- * 接收参数方法
- *
- * @param t 对象
- * @param p1 参数一
- * @param p2 参数二
- */
- void accept(T t, P1 p1, P2 p2);
-
- /**
- * 将带有参数的Consumer转换为无参{@link Consumer}
- *
- * @param p1 参数1
- * @param p2 参数2
- * @return {@link Consumer}
- */
- default Consumer toConsumer(P1 p1, P2 p2) {
- return instant -> accept(instant, p1, p2);
- }
-}
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer3.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer3.java
deleted file mode 100755
index 2f5b2eb57..000000000
--- a/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer3.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package cn.hutool.core.lang.func;
-
-import java.util.function.Consumer;
-
-/**
- * 3参数Consumer
- *
- * @param 目标类型
- * @param 参数一类型
- * @param 参数二类型
- * @param 参数三类型
- * @author TomXin
- * @since 5.7.21
- */
-@FunctionalInterface
-public interface Consumer3 {
- /**
- * 接收参数方法
- *
- * @param t 对象
- * @param p1 参数一
- * @param p2 参数二
- * @param p3 参数三
- */
- void accept(T t, P1 p1, P2 p2, P3 p3);
-
- /**
- * 将带有参数的Consumer转换为无参{@link Consumer}
- *
- * @param p1 参数1
- * @param p2 参数2
- * @param p3 参数3
- * @return {@link Consumer}
- */
- default Consumer toConsumer(P1 p1, P2 p2, P3 p3) {
- return instant -> accept(instant, p1, p2, p3);
- }
-}
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer4.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer4.java
deleted file mode 100755
index 59cd66c1e..000000000
--- a/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer4.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package cn.hutool.core.lang.func;
-
-import java.util.function.Consumer;
-
-/**
- * 4参数Consumer
- *
- * @param 目标类型
- * @param 参数一类型
- * @param 参数二类型
- * @param 参数三类型
- * @param 参数四类型
- * @author TomXin
- * @since 5.7.21
- */
-@FunctionalInterface
-public interface Consumer4 {
- /**
- * 接收参数方法
- *
- * @param t 对象
- * @param p1 参数一
- * @param p2 参数二
- * @param p3 参数三
- * @param p4 参数四
- */
- void accept(T t, P1 p1, P2 p2, P3 p3, P4 p4);
-
- /**
- * 将带有参数的Consumer转换为无参{@link Consumer}
- *
- * @param p1 参数1
- * @param p2 参数2
- * @param p3 参数3
- * @param p4 参数4
- * @return {@link Consumer}
- */
- default Consumer toConsumer(P1 p1, P2 p2, P3 p3, P4 p4) {
- return instant -> accept(instant, p1, p2, p3, p4);
- }
-}
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer5.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer5.java
deleted file mode 100755
index be18f3e1f..000000000
--- a/hutool-core/src/main/java/cn/hutool/core/lang/func/Consumer5.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package cn.hutool.core.lang.func;
-
-import java.util.function.Consumer;
-
-/**
- * 5参数Consumer
- *
- * @param 目标 类型
- * @param 参数一 类型
- * @param 参数二 类型
- * @param 参数三 类型
- * @param 参数四 类型
- * @param 参数五 类型
- * @author TomXin
- * @since 5.7.21
- */
-@FunctionalInterface
-public interface Consumer5 {
- /**
- * 接收参数方法
- *
- * @param t 对象
- * @param p1 参数一
- * @param p2 参数二
- * @param p3 参数三
- * @param p4 参数四
- * @param p5 参数五
- */
- void accept(T t, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5);
-
- /**
- * 将带有参数的Consumer转换为无参{@link Consumer}
- *
- * @param p1 参数1
- * @param p2 参数2
- * @param p3 参数3
- * @param p4 参数4
- * @param p5 参数5
- * @return {@link Consumer}
- */
- default Consumer toConsumer(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
- return instant -> accept(instant, p1, p2, p3, p4, p5);
- }
-}
diff --git a/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java b/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java
index f5c8c9732..5ae5fdfce 100644
--- a/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java
@@ -1,7 +1,10 @@
package cn.hutool.core.builder;
import cn.hutool.core.util.StrUtil;
-import lombok.*;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
import org.junit.Assert;
import org.junit.Test;
@@ -58,6 +61,7 @@ public class GenericBuilderTest {
@Getter
@Setter
@ToString
+ @Accessors(chain = true)
public static class Box {
private Long id;
private String title;
From da4c1d3bf78a636087bbbc66541fd23226da4b56 Mon Sep 17 00:00:00 2001
From: Looly
Date: Mon, 7 Feb 2022 17:03:05 +0800
Subject: [PATCH 41/43] fix code
---
.../src/main/java/cn/hutool/core/builder/GenericBuilder.java | 5 +----
.../test/java/cn/hutool/core/builder/GenericBuilderTest.java | 2 ++
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/hutool-core/src/main/java/cn/hutool/core/builder/GenericBuilder.java b/hutool-core/src/main/java/cn/hutool/core/builder/GenericBuilder.java
index c821ac4b2..829ff54db 100644
--- a/hutool-core/src/main/java/cn/hutool/core/builder/GenericBuilder.java
+++ b/hutool-core/src/main/java/cn/hutool/core/builder/GenericBuilder.java
@@ -45,10 +45,7 @@ import java.util.function.Supplier;
* .with(Box::alis)
* .build();
*
- * 注意:本工具类支持调用的方法的参数数量不超过5个,更多的参数不利于阅读和维护。
- * 关于Java方法的参数个数限制似乎并没有明确统一的规范,网络上众说纷纭,这里取个相对平均的数5。
- * 特殊需要求可以基于此类进行拓展.
- *
+ * 注意:本工具类支持调用的方法的参数数量不超过1个,更多的参数不利于阅读和维护。
*
* @author TomXin
* @since 5.7.21
diff --git a/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java b/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java
index 5ae5fdfce..84f6d4581 100644
--- a/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java
@@ -32,6 +32,7 @@ public class GenericBuilderTest {
Assert.assertEquals(8, box.getWidth().intValue());
Assert.assertEquals(7, box.getHeight().intValue());
+ // 对象修改
Box boxModified = GenericBuilder
.of(() -> box)
.with(Box::setTitle, "Hello Friend!")
@@ -46,6 +47,7 @@ public class GenericBuilderTest {
Assert.assertEquals(4, boxModified.getWidth().intValue());
Assert.assertEquals(5, boxModified.getHeight().intValue());
+ // 多参数构造
Box box1 = GenericBuilder
.of(Box::new, 2048L, "Hello Partner!", 222, 333, 444)
.with(Box::alis)
From bbb12fa22d8661b0a940e760058847c797027480 Mon Sep 17 00:00:00 2001
From: Looly
Date: Mon, 7 Feb 2022 17:51:53 +0800
Subject: [PATCH 42/43] add method
---
CHANGELOG.md | 1 +
.../main/java/cn/hutool/core/io/FileUtil.java | 43 +++++++++++++------
.../main/java/cn/hutool/core/io/NioUtil.java | 6 +--
3 files changed, 33 insertions(+), 17 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 741ef609f..6ce31bdb6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,6 +17,7 @@
* 【core 】 CharSequenceUtil增加replace重载(issue#2122@Github)
* 【core 】 IntMap和LongMap使用位运算快速求解取余运算(pr#2123@Github)
* 【core 】 新增通用builder类:GenericBuilder(pr#526@Gitee)
+* 【core 】 新增copySafely方法与mkdirsSafely方法(pr#527@Gitee)
### 🐞Bug修复
* 【core 】 修复ChineseDate农历获取正月出现数组越界BUG(issue#2112@Github)
diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java
index 6fc1f748f..72eb18ca6 100644
--- a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java
@@ -527,26 +527,39 @@ public class FileUtil extends PathUtil {
/**
* 计算目录或文件的总大小
* 当给定对象为文件时,直接调用 {@link File#length()}
- * 当给定对象为目录时,遍历目录下的所有文件和目录,递归计算其大小,求和返回
+ * 当给定对象为目录时,遍历目录下的所有文件和目录,递归计算其大小,求和返回
+ * 此方法不包括目录本身的占用空间大小。
*
* @param file 目录或文件,null或者文件不存在返回0
* @return 总大小,bytes长度
*/
public static long size(File file) {
+ return size(file, false);
+ }
+
+ /**
+ * 计算目录或文件的总大小
+ * 当给定对象为文件时,直接调用 {@link File#length()}
+ * 当给定对象为目录时,遍历目录下的所有文件和目录,递归计算其大小,求和返回
+ *
+ * @param file 目录或文件,null或者文件不存在返回0
+ * @param includeDirSize 是否包括每层目录本身的大小
+ * @return 总大小,bytes长度
+ * @since 5.7.21
+ */
+ public static long size(File file, boolean includeDirSize) {
if (null == file || false == file.exists() || isSymlink(file)) {
return 0;
}
if (file.isDirectory()) {
- // TODO: 是否需要统计目录本身的大小呢?
- // size += file.length();
- long size = 0L;
+ long size = includeDirSize ? file.length() : 0;
File[] subFiles = file.listFiles();
if (ArrayUtil.isEmpty(subFiles)) {
return 0L;// empty directory
}
for (File subFile : subFiles) {
- size += size(subFile);
+ size += size(subFile, includeDirSize);
}
return size;
} else {
@@ -610,7 +623,6 @@ public class FileUtil extends PathUtil {
return null;
}
if (false == file.exists()) {
- // TODO: {@see mkdirsSafely} 确保并发环境下的安全创建
mkParentDirs(file);
try {
//noinspection ResultOfMethodCallIgnored
@@ -815,7 +827,7 @@ public class FileUtil extends PathUtil {
/**
* 创建文件夹,会递归自动创建其不存在的父文件夹,如果存在直接返回此文件夹
- * 此方法不对File对象类型做判断,如果File不存在,无法判断其类型
+ * 此方法不对File对象类型做判断,如果File不存在,无法判断其类型
*
* @param dir 目录
* @return 创建的目录
@@ -825,8 +837,7 @@ public class FileUtil extends PathUtil {
return null;
}
if (false == dir.exists()) {
- //noinspection ResultOfMethodCallIgnored
- dir.mkdirs();
+ mkdirsSafely(dir, 5, 1);
}
return dir;
}
@@ -843,23 +854,27 @@ public class FileUtil extends PathUtil {
*
*
* @param dir 待创建的目录
+ * @param tryCount 最大尝试次数
+ * @param sleepMillis 线程等待的毫秒数
* @return true表示创建成功,false表示创建失败
- * @since 2022-01-29
+ * @since 5.7.21
* @author z8g
*/
- public static boolean mkdirsSafely(File dir) {
+ public static boolean mkdirsSafely(File dir, int tryCount, long sleepMillis) {
if (dir == null) {
return false;
}
if (dir.isDirectory()) {
return true;
}
- for (int i = 1; i <= 5; i++) { // 高并发场景下,可以看到 i 处于 1 ~ 3 之间
- dir.mkdirs(); // 如果文件已存在,也会返回 false,所以该值不能作为是否能创建的依据,因此不对其进行处理
+ for (int i = 1; i <= tryCount; i++) { // 高并发场景下,可以看到 i 处于 1 ~ 3 之间
+ // 如果文件已存在,也会返回 false,所以该值不能作为是否能创建的依据,因此不对其进行处理
+ //noinspection ResultOfMethodCallIgnored
+ dir.mkdirs();
if (dir.exists()) {
return true;
}
- ThreadUtil.sleep(1);
+ ThreadUtil.sleep(sleepMillis);
}
return dir.exists();
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/io/NioUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/NioUtil.java
index c247185b2..806105051 100644
--- a/hutool-core/src/main/java/cn/hutool/core/io/NioUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/io/NioUtil.java
@@ -117,13 +117,13 @@ public class NioUtil {
* @link http://androidxref.com/6.0.1_r10/xref/libcore/luni/src/main/java/java/nio/FileChannelImpl.java
* @link http://androidxref.com/7.0.0_r1/xref/libcore/ojluni/src/main/java/sun/nio/ch/FileChannelImpl.java
* @link http://androidxref.com/7.0.0_r1/xref/libcore/ojluni/src/main/native/FileChannelImpl.c
- * @since 2022-01-29
* @author z8g
+ * @since 5.7.21
*/
private static long copySafely(FileChannel inChannel, FileChannel outChannel) throws IOException {
- long totalBytes = inChannel.size();
+ final long totalBytes = inChannel.size();
for (long pos = 0, remaining = totalBytes; remaining > 0; ) { // 确保文件内容不会缺失
- long writeBytes = inChannel.transferTo(pos, remaining, outChannel); // 实际传输的字节数
+ final long writeBytes = inChannel.transferTo(pos, remaining, outChannel); // 实际传输的字节数
pos += writeBytes;
remaining -= writeBytes;
}
From d5916b9998015346cbddb80c52de90fdfe5cad6c Mon Sep 17 00:00:00 2001
From: Looly
Date: Mon, 7 Feb 2022 19:04:37 +0800
Subject: [PATCH 43/43] fix bug
---
CHANGELOG.md | 1 +
hutool-dfa/pom.xml | 5 ---
.../java/cn/hutool/dfa/SensitiveUtil.java | 19 ++++++++---
.../src/main/java/cn/hutool/dfa/WordTree.java | 12 +++----
.../src/test/java/cn/hutool/dfa/DfaTest.java | 33 ++++++++++++++++---
.../java/cn/hutool/dfa/SensitiveUtilTest.java | 26 ++++++---------
6 files changed, 60 insertions(+), 36 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6ce31bdb6..6686d2456 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -23,6 +23,7 @@
* 【core 】 修复ChineseDate农历获取正月出现数组越界BUG(issue#2112@Github)
* 【extra 】 修复EmojiUtil.toHtmlHex()方法(pr#519@Gitee)
* 【system 】 修复CpuInfo.getUsed()方法(issue#2116@Github)
+* 【dfa 】 修复密集匹配和贪婪匹配冲突问题(issue#2126@Github)
-------------------------------------------------------------------------------------------------------------
# 5.7.20 (2022-01-20)
diff --git a/hutool-dfa/pom.xml b/hutool-dfa/pom.xml
index 6416c6f74..3e05431b2 100644
--- a/hutool-dfa/pom.xml
+++ b/hutool-dfa/pom.xml
@@ -17,11 +17,6 @@
Hutool 基于DFA的关键词查找
-
- cn.hutool
- hutool-core
- ${project.parent.version}
-
cn.hutool
hutool-json
diff --git a/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java b/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java
index 0c2584690..bcf81a784 100644
--- a/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java
+++ b/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java
@@ -195,11 +195,21 @@ public final class SensitiveUtil {
*/
public static T sensitiveFilter(T bean, boolean isGreedMatch, SensitiveProcessor sensitiveProcessor) {
String jsonText = JSONUtil.toJsonStr(bean);
- @SuppressWarnings("unchecked")
- final Class c = (Class) bean.getClass();
+ @SuppressWarnings("unchecked") final Class