add methods

This commit is contained in:
Looly 2020-10-15 18:16:56 +08:00
parent 72ea16b980
commit fb46196782
5 changed files with 407 additions and 386 deletions

View File

@ -19,6 +19,7 @@
* 【core 】 优化Combination.countAllpr#1159@Github * 【core 】 优化Combination.countAllpr#1159@Github
* 【core 】 优化针对list的split方法pr#194@Gitee * 【core 】 优化针对list的split方法pr#194@Gitee
* 【poi 】 ExcelWriter增加setRowStyle方法 * 【poi 】 ExcelWriter增加setRowStyle方法
* 【core 】 Assert增加函数接口pr#1166@Github
### Bug修复 ### Bug修复
* 【core 】 解决农历判断节日未判断大小月导致的问题issue#I1XHSF@Gitee * 【core 】 解决农历判断节日未判断大小月导致的问题issue#I1XHSF@Gitee

View File

@ -1,11 +1,10 @@
package cn.hutool.core.lang; package cn.hutool.core.lang;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.func.Func0; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import java.util.Collection;
import java.util.Map; import java.util.Map;
import java.util.function.Supplier; import java.util.function.Supplier;
@ -14,28 +13,9 @@ import java.util.function.Supplier;
* 断言某些对象或值是否符合规定否则抛出异常经常用于做变量检查 * 断言某些对象或值是否符合规定否则抛出异常经常用于做变量检查
* *
* @author Looly * @author Looly
*
*/ */
public class Assert { public class Assert {
/**
* 断言是否为真如果为 {@code false} 抛出异常<br>
* 并使用指定的函数获取错误信息返回
* <pre class="code">
* Assert.isTrue(i &gt; 0, ()->{
* // to query relation message
* return "relation message to return ";
* });
* </pre>
*
* @param expression 布尔值
* @param errorMsgSupplier 错误抛出异常附带的消息生产接口
* @throws IllegalArgumentException if expression is {@code false}
*/
public static void isTrue(boolean expression, Supplier<String> errorMsgSupplier) throws IllegalArgumentException {
if (!expression) {
isTrue(false, errorMsgSupplier.get());
}
}
/** /**
* 断言是否为真如果为 {@code false} 抛出给定的异常<br> * 断言是否为真如果为 {@code false} 抛出给定的异常<br>
* *
@ -48,9 +28,9 @@ public class Assert {
* @param supplier 指定断言不通过时抛出的异常 * @param supplier 指定断言不通过时抛出的异常
* @throws X if expression is {@code false} * @throws X if expression is {@code false}
*/ */
public static <X extends Throwable> void isTrue(boolean expression, Func0<? extends X> supplier) throws X { public static <X extends Throwable> void isTrue(boolean expression, Supplier<? extends X> supplier) throws X {
if (false == expression) { if (false == expression) {
throw supplier.callWithRuntimeException(); throw supplier.get();
} }
} }
@ -67,9 +47,7 @@ public class Assert {
* @throws IllegalArgumentException if expression is {@code false} * @throws IllegalArgumentException if expression is {@code false}
*/ */
public static void isTrue(boolean expression, String errorMsgTemplate, Object... params) throws IllegalArgumentException { public static void isTrue(boolean expression, String errorMsgTemplate, Object... params) throws IllegalArgumentException {
if (false == expression) { isTrue(expression, () -> new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params)));
throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
}
} }
/** /**
@ -85,25 +63,29 @@ public class Assert {
public static void isTrue(boolean expression) throws IllegalArgumentException { public static void isTrue(boolean expression) throws IllegalArgumentException {
isTrue(expression, "[Assertion failed] - this expression must be true"); isTrue(expression, "[Assertion failed] - this expression must be true");
} }
/** /**
* 断言是否为假如果为 {@code true} 抛出 {@code IllegalArgumentException} 异常<br> * 断言是否为假如果为 {@code true} 抛出指定类型异常<br>
* 并使用指定的函数获取错误信息返回 * 并使用指定的函数获取错误信息返回
* <pre class="code"> * <pre class="code">
* Assert.isFalse(i &gt; 0, ()->{ * Assert.isFalse(i &gt; 0, ()->{
* // to query relation message * // to query relation message
* return "relation message to return "; * return new IllegalArgumentException("relation message to return");
* }); * });
* </pre> * </pre>
* *
* @param <X> 异常类型
* @param expression 布尔值 * @param expression 布尔值
* @param errorMsgSupplier 错误抛出异常附带的消息生产接口 * @param errorSupplier 指定断言不通过时抛出的异常
* @throws IllegalArgumentException if expression is {@code false} * @throws X if expression is {@code false}
* @since 5.4.5
*/ */
public static void isFalse(boolean expression, Supplier<String> errorMsgSupplier) throws IllegalArgumentException { public static <X extends Throwable> void isFalse(boolean expression, Supplier<X> errorSupplier) throws X {
if (expression) { if (expression) {
isFalse(true, errorMsgSupplier.get()); throw errorSupplier.get();
} }
} }
/** /**
* 断言是否为假如果为 {@code true} 抛出 {@code IllegalArgumentException} 异常<br> * 断言是否为假如果为 {@code true} 抛出 {@code IllegalArgumentException} 异常<br>
* *
@ -117,9 +99,7 @@ public class Assert {
* @throws IllegalArgumentException if expression is {@code false} * @throws IllegalArgumentException if expression is {@code false}
*/ */
public static void isFalse(boolean expression, String errorMsgTemplate, Object... params) throws IllegalArgumentException { public static void isFalse(boolean expression, String errorMsgTemplate, Object... params) throws IllegalArgumentException {
if (expression) { isFalse(expression, () -> new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params)));
throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
}
} }
/** /**
@ -135,25 +115,29 @@ public class Assert {
public static void isFalse(boolean expression) throws IllegalArgumentException { public static void isFalse(boolean expression) throws IllegalArgumentException {
isFalse(expression, "[Assertion failed] - this expression must be false"); isFalse(expression, "[Assertion failed] - this expression must be false");
} }
/** /**
* 断言对象是否为{@code null} 如果不为{@code null} 抛出{@link IllegalArgumentException} 异常 * 断言对象是否为{@code null} 如果不为{@code null} 抛出指定类型异常
* 并使用指定的函数获取错误信息返回 * 并使用指定的函数获取错误信息返回
* <pre class="code"> * <pre class="code">
* Assert.isNull(value, ()->{ * Assert.isNull(value, ()->{
* // to query relation message * // to query relation message
* return "relation message to return "; * return new IllegalArgumentException("relation message to return");
* }); * });
* </pre> * </pre>
* *
* @param <X> 异常类型
* @param object 被检查的对象 * @param object 被检查的对象
* @param errorMsgSupplier 错误抛出异常附带的消息生产接口 * @param errorSupplier 错误抛出异常附带的消息生产接口
* @throws IllegalArgumentException if the object is not {@code null} * @throws X if the object is not {@code null}
* @since 5.4.5
*/ */
public static void isNull(Object object, Supplier<String> errorMsgSupplier) throws IllegalArgumentException { public static <X extends Throwable> void isNull(Object object, Supplier<X> errorSupplier) throws X {
if (object != null) { if (null != object) {
isNull(object, errorMsgSupplier.get()); throw errorSupplier.get();
} }
} }
/** /**
* 断言对象是否为{@code null} 如果不为{@code null} 抛出{@link IllegalArgumentException} 异常 * 断言对象是否为{@code null} 如果不为{@code null} 抛出{@link IllegalArgumentException} 异常
* *
@ -167,9 +151,7 @@ public class Assert {
* @throws IllegalArgumentException if the object is not {@code null} * @throws IllegalArgumentException if the object is not {@code null}
*/ */
public static void isNull(Object object, String errorMsgTemplate, Object... params) throws IllegalArgumentException { public static void isNull(Object object, String errorMsgTemplate, Object... params) throws IllegalArgumentException {
if (object != null) { isNull(object, () -> new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params)));
throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
}
} }
/** /**
@ -187,28 +169,32 @@ public class Assert {
} }
// ----------------------------------------------------------------------------------------------------------- Check not null // ----------------------------------------------------------------------------------------------------------- Check not null
/** /**
* 断言对象是否不为{@code null} 如果为{@code null} 抛出{@link IllegalArgumentException} 异常 Assert that an object is not {@code null} . * 断言对象是否不为{@code null} 如果为{@code null} 抛出指定类型异常
* 并使用指定的函数获取错误信息返回 * 并使用指定的函数获取错误信息返回
* <pre class="code"> * <pre class="code">
* Assert.notNull(clazz, ()->{ * Assert.notNull(clazz, ()->{
* // to query relation message * // to query relation message
* return "relation message to return "; * return new IllegalArgumentException("relation message to return");
* }); * });
* </pre> * </pre>
* *
* @param <T> 被检查对象泛型类型 * @param <T> 被检查对象泛型类型
* @param <X> 异常类型
* @param object 被检查对象 * @param object 被检查对象
* @param errorMsgSupplier 错误抛出异常附带的消息生产接口 * @param errorSupplier 错误抛出异常附带的消息生产接口
* @return 被检查后的对象 * @return 被检查后的对象
* @throws IllegalArgumentException if the object is {@code null} * @throws X if the object is {@code null}
* @since 5.4.5
*/ */
public static <T> T notNull(T object, Supplier<String> errorMsgSupplier) throws IllegalArgumentException { public static <T, X extends Throwable> T notNull(T object, Supplier<X> errorSupplier) throws X {
if (object == null) { if (null == object) {
notNull(null, errorMsgSupplier.get()); throw errorSupplier.get();
} }
return object; return object;
} }
/** /**
* 断言对象是否不为{@code null} 如果为{@code null} 抛出{@link IllegalArgumentException} 异常 Assert that an object is not {@code null} . * 断言对象是否不为{@code null} 如果为{@code null} 抛出{@link IllegalArgumentException} 异常 Assert that an object is not {@code null} .
* *
@ -224,10 +210,7 @@ public class Assert {
* @throws IllegalArgumentException if the object is {@code null} * @throws IllegalArgumentException if the object is {@code null}
*/ */
public static <T> T notNull(T object, String errorMsgTemplate, Object... params) throws IllegalArgumentException { public static <T> T notNull(T object, String errorMsgTemplate, Object... params) throws IllegalArgumentException {
if (object == null) { return notNull(object, () -> new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params)));
throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
}
return object;
} }
/** /**
@ -247,29 +230,32 @@ public class Assert {
} }
// ----------------------------------------------------------------------------------------------------------- Check empty // ----------------------------------------------------------------------------------------------------------- Check empty
/** /**
* 检查给定字符串是否为空为空抛出 {@link IllegalArgumentException} * 检查给定字符串是否为空为空抛出自定义异常并使用指定的函数获取错误信息返回
* 并使用指定的函数获取错误信息返回
* <pre class="code"> * <pre class="code">
* Assert.notEmpty(name, ()->{ * Assert.notEmpty(name, ()->{
* // to query relation message * // to query relation message
* return "relation message to return "; * return new IllegalArgumentException("relation message to return");
* }); * });
* </pre> * </pre>
* *
* @param <X> 异常类型
* @param <T> 字符串类型 * @param <T> 字符串类型
* @param text 被检查字符串 * @param text 被检查字符串
* @param errorMsgSupplier 错误抛出异常附带的消息生产接口 * @param errorSupplier 错误抛出异常附带的消息生产接口
* @return 非空字符串 * @return 非空字符串
* @throws X 被检查字符串为空抛出此异常
* @see StrUtil#isNotEmpty(CharSequence) * @see StrUtil#isNotEmpty(CharSequence)
* @throws IllegalArgumentException 被检查字符串为空 * @since 5.4.5
*/ */
public static <T extends CharSequence> T notEmpty(T text, Supplier<String> errorMsgSupplier) throws IllegalArgumentException { public static <T extends CharSequence, X extends Throwable> T notEmpty(T text, Supplier<X> errorSupplier) throws X {
if (StrUtil.isEmpty(text)) { if (StrUtil.isEmpty(text)) {
notEmpty(text, errorMsgSupplier.get()); throw errorSupplier.get();
} }
return text; return text;
} }
/** /**
* 检查给定字符串是否为空为空抛出 {@link IllegalArgumentException} * 检查给定字符串是否为空为空抛出 {@link IllegalArgumentException}
* *
@ -282,14 +268,11 @@ public class Assert {
* @param errorMsgTemplate 错误消息模板变量使用{}表示 * @param errorMsgTemplate 错误消息模板变量使用{}表示
* @param params 参数 * @param params 参数
* @return 非空字符串 * @return 非空字符串
* @see StrUtil#isNotEmpty(CharSequence)
* @throws IllegalArgumentException 被检查字符串为空 * @throws IllegalArgumentException 被检查字符串为空
* @see StrUtil#isNotEmpty(CharSequence)
*/ */
public static <T extends CharSequence> T notEmpty(T text, String errorMsgTemplate, Object... params) throws IllegalArgumentException { public static <T extends CharSequence> T notEmpty(T text, String errorMsgTemplate, Object... params) throws IllegalArgumentException {
if (StrUtil.isEmpty(text)) { return notEmpty(text, () -> new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params)));
throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
}
return text;
} }
/** /**
@ -302,35 +285,38 @@ public class Assert {
* @param <T> 字符串类型 * @param <T> 字符串类型
* @param text 被检查字符串 * @param text 被检查字符串
* @return 被检查的字符串 * @return 被检查的字符串
* @see StrUtil#isNotEmpty(CharSequence)
* @throws IllegalArgumentException 被检查字符串为空 * @throws IllegalArgumentException 被检查字符串为空
* @see StrUtil#isNotEmpty(CharSequence)
*/ */
public static <T extends CharSequence> T notEmpty(T text) throws IllegalArgumentException { public static <T extends CharSequence> T notEmpty(T text) throws IllegalArgumentException {
return notEmpty(text, "[Assertion failed] - this String argument must have length; it must not be null or empty"); return notEmpty(text, "[Assertion failed] - this String argument must have length; it must not be null or empty");
} }
/** /**
* 检查给定字符串是否为空白null空串或只包含空白符为空抛出 {@link IllegalArgumentException} * 检查给定字符串是否为空白null空串或只包含空白符为空抛出自定义异常
* 并使用指定的函数获取错误信息返回 * 并使用指定的函数获取错误信息返回
* <pre class="code"> * <pre class="code">
* Assert.notBlank(name, ()->{ * Assert.notBlank(name, ()->{
* // to query relation message * // to query relation message
* return "relation message to return "; * return new IllegalArgumentException("relation message to return");
* }); * });
* </pre> * </pre>
* *
* @param <X> 异常类型
* @param <T> 字符串类型 * @param <T> 字符串类型
* @param text 被检查字符串 * @param text 被检查字符串
* @param errorMsgSupplier 错误抛出异常附带的消息生产接口 * @param errorMsgSupplier 错误抛出异常附带的消息生产接口
* @return 非空字符串 * @return 非空字符串
* @throws X 被检查字符串为空白
* @see StrUtil#isNotBlank(CharSequence) * @see StrUtil#isNotBlank(CharSequence)
* @throws IllegalArgumentException 被检查字符串为空白
*/ */
public static <T extends CharSequence> T notBlank(T text, Supplier<String> errorMsgSupplier) throws IllegalArgumentException { public static <T extends CharSequence, X extends Throwable> T notBlank(T text, Supplier<X> errorMsgSupplier) throws X {
if (StrUtil.isBlank(text)) { if (StrUtil.isBlank(text)) {
notBlank(text, errorMsgSupplier.get()); throw errorMsgSupplier.get();
} }
return text; return text;
} }
/** /**
* 检查给定字符串是否为空白null空串或只包含空白符为空抛出 {@link IllegalArgumentException} * 检查给定字符串是否为空白null空串或只包含空白符为空抛出 {@link IllegalArgumentException}
* *
@ -343,14 +329,11 @@ public class Assert {
* @param errorMsgTemplate 错误消息模板变量使用{}表示 * @param errorMsgTemplate 错误消息模板变量使用{}表示
* @param params 参数 * @param params 参数
* @return 非空字符串 * @return 非空字符串
* @see StrUtil#isNotBlank(CharSequence)
* @throws IllegalArgumentException 被检查字符串为空白 * @throws IllegalArgumentException 被检查字符串为空白
* @see StrUtil#isNotBlank(CharSequence)
*/ */
public static <T extends CharSequence> T notBlank(T text, String errorMsgTemplate, Object... params) throws IllegalArgumentException { public static <T extends CharSequence> T notBlank(T text, String errorMsgTemplate, Object... params) throws IllegalArgumentException {
if (StrUtil.isBlank(text)) { return notBlank(text, () -> new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params)));
throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
}
return text;
} }
/** /**
@ -363,39 +346,45 @@ public class Assert {
* @param <T> 字符串类型 * @param <T> 字符串类型
* @param text 被检查字符串 * @param text 被检查字符串
* @return 非空字符串 * @return 非空字符串
* @see StrUtil#isNotBlank(CharSequence)
* @throws IllegalArgumentException 被检查字符串为空白 * @throws IllegalArgumentException 被检查字符串为空白
* @see StrUtil#isNotBlank(CharSequence)
*/ */
public static <T extends CharSequence> T notBlank(T text) throws IllegalArgumentException { public static <T extends CharSequence> T notBlank(T text) throws IllegalArgumentException {
return notBlank(text, "[Assertion failed] - this String argument must have text; it must not be null, empty, or blank"); return notBlank(text, "[Assertion failed] - this String argument must have text; it must not be null, empty, or blank");
} }
/** /**
* 断言给定字符串是否不被另一个字符串包含即是否为子串 * 断言给定字符串是否不被另一个字符串包含即是否为子串
* 并使用指定的函数获取错误信息返回 * 并使用指定的函数获取错误信息返回
* <pre class="code"> * <pre class="code">
* Assert.doesNotContain(name, "rod", ()->{ * Assert.notContain(name, "rod", ()->{
* // to query relation message * // to query relation message
* return "relation message to return "; * return new IllegalArgumentException("relation message to return ");
* }); * });
* </pre> * </pre>
* *
* @param <T> 字符串类型
* @param <X> 异常类型
* @param textToSearch 被搜索的字符串 * @param textToSearch 被搜索的字符串
* @param substring 被检查的子串 * @param substring 被检查的子串
* @param errorMsgSupplier 错误抛出异常附带的消息生产接口 * @param errorSupplier 错误抛出异常附带的消息生产接口
* @return 被检查的子串 * @return 被检查的子串
* @throws IllegalArgumentException 非子串抛出异常 * @throws X 非子串抛出异常
* @see StrUtil#contains(CharSequence, CharSequence)
* @since 5.4.5
*/ */
public static String notContain(String textToSearch, String substring, Supplier<String> errorMsgSupplier) throws IllegalArgumentException { public static <T extends CharSequence, X extends Throwable> T notContain(CharSequence textToSearch, T substring, Supplier<X> errorSupplier) throws X {
if (StrUtil.isNotEmpty(textToSearch) && StrUtil.isNotEmpty(substring) && textToSearch.contains(substring)) { if (StrUtil.contains(textToSearch, substring)) {
throw new IllegalArgumentException(errorMsgSupplier.get()); throw errorSupplier.get();
} }
return substring; return substring;
} }
/** /**
* 断言给定字符串是否不被另一个字符串包含即是否为子串 * 断言给定字符串是否不被另一个字符串包含即是否为子串
* *
* <pre class="code"> * <pre class="code">
* Assert.doesNotContain(name, "rod", "Name must not contain 'rod'"); * Assert.notContain(name, "rod", "Name must not contain 'rod'");
* </pre> * </pre>
* *
* @param textToSearch 被搜索的字符串 * @param textToSearch 被搜索的字符串
@ -406,17 +395,14 @@ public class Assert {
* @throws IllegalArgumentException 非子串抛出异常 * @throws IllegalArgumentException 非子串抛出异常
*/ */
public static String notContain(String textToSearch, String substring, String errorMsgTemplate, Object... params) throws IllegalArgumentException { public static String notContain(String textToSearch, String substring, String errorMsgTemplate, Object... params) throws IllegalArgumentException {
if (StrUtil.isNotEmpty(textToSearch) && StrUtil.isNotEmpty(substring) && textToSearch.contains(substring)) { return notContain(textToSearch, substring, () -> new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params)));
throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
}
return substring;
} }
/** /**
* 断言给定字符串是否不被另一个字符串包含即是否为子串 * 断言给定字符串是否不被另一个字符串包含即是否为子串
* *
* <pre class="code"> * <pre class="code">
* Assert.doesNotContain(name, "rod", "Name must not contain 'rod'"); * Assert.notContain(name, "rod", "Name must not contain 'rod'");
* </pre> * </pre>
* *
* @param textToSearch 被搜索的字符串 * @param textToSearch 被搜索的字符串
@ -427,43 +413,30 @@ public class Assert {
public static String notContain(String textToSearch, String substring) throws IllegalArgumentException { public static String notContain(String textToSearch, String substring) throws IllegalArgumentException {
return notContain(textToSearch, substring, "[Assertion failed] - this String argument must not contain the substring [{}]", substring); return notContain(textToSearch, substring, "[Assertion failed] - this String argument must not contain the substring [{}]", substring);
} }
/** /**
* 断言给定数组是否包含元素数组必须不为 {@code null} 且至少包含一个元素 * 断言给定数组是否包含元素数组必须不为 {@code null} 且至少包含一个元素
* 并使用指定的函数获取错误信息返回 * 并使用指定的函数获取错误信息返回
*
* <pre class="code"> * <pre class="code">
* Assert.notEmpty(array, ()->{ * Assert.notEmpty(array, ()->{
* // to query relation message * // to query relation message
* return "relation message to return "; * return new IllegalArgumentException("relation message to return");
* }); * });
* </pre> * </pre>
* *
* @param <T> 数组元素类型
* @param <X> 异常类型
* @param array 被检查的数组 * @param array 被检查的数组
* @param errorMsgSupplier 错误抛出异常附带的消息生产接口 * @param errorSupplier 错误抛出异常附带的消息生产接口
* @return 被检查的数组 * @return 被检查的数组
* @throws IllegalArgumentException if the object array is {@code null} or has no elements * @throws X if the object array is {@code null} or has no elements
* @see ArrayUtil#isNotEmpty(Object[])
* @since 5.4.5
*/ */
public static Object[] notEmpty(Object[] array, Supplier<String> errorMsgSupplier) throws IllegalArgumentException { public static <T, X extends Throwable> T[] notEmpty(T[] array, Supplier<X> errorSupplier) throws X {
if (ArrayUtil.isEmpty(array)) { if (ArrayUtil.isEmpty(array)) {
throw new IllegalArgumentException(errorMsgSupplier.get()); throw errorSupplier.get();
}
return array;
}
/**
* 断言给定数组是否包含元素数组必须不为 {@code null} 且至少包含一个元素
*
* <pre class="code">
* Assert.notEmpty(array, "The array must have elements");
* </pre>
*
* @param array 被检查的数组
* @param errorMsgTemplate 异常时的消息模板
* @param params 参数列表
* @return 被检查的数组
* @throws IllegalArgumentException if the object array is {@code null} or has no elements
*/
public static Object[] notEmpty(Object[] array, String errorMsgTemplate, Object... params) throws IllegalArgumentException {
if (ArrayUtil.isEmpty(array)) {
throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
} }
return array; return array;
} }
@ -475,35 +448,58 @@ public class Assert {
* Assert.notEmpty(array, "The array must have elements"); * Assert.notEmpty(array, "The array must have elements");
* </pre> * </pre>
* *
* @param <T> 数组元素类型
* @param array 被检查的数组
* @param errorMsgTemplate 异常时的消息模板
* @param params 参数列表
* @return 被检查的数组
* @throws IllegalArgumentException if the object array is {@code null} or has no elements
*/
public static <T> T[] notEmpty(T[] array, String errorMsgTemplate, Object... params) throws IllegalArgumentException {
return notEmpty(array, () -> new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params)));
}
/**
* 断言给定数组是否包含元素数组必须不为 {@code null} 且至少包含一个元素
*
* <pre class="code">
* Assert.notEmpty(array, "The array must have elements");
* </pre>
*
* @param <T> 数组元素类型
* @param array 被检查的数组 * @param array 被检查的数组
* @return 被检查的数组 * @return 被检查的数组
* @throws IllegalArgumentException if the object array is {@code null} or has no elements * @throws IllegalArgumentException if the object array is {@code null} or has no elements
*/ */
public static Object[] notEmpty(Object[] array) throws IllegalArgumentException { public static <T> T[] notEmpty(T[] array) throws IllegalArgumentException {
return notEmpty(array, "[Assertion failed] - this array must not be empty: it must contain at least 1 element"); return notEmpty(array, "[Assertion failed] - this array must not be empty: it must contain at least 1 element");
} }
/** /**
* 断言给定数组是否不包含{@code null}元素如果数组为空或 {@code null}将被认为不包含 * 断言给定数组是否不包含{@code null}元素如果数组为空或 {@code null}将被认为不包含
* 并使用指定的函数获取错误信息返回 * 并使用指定的函数获取错误信息返回
* <pre class="code"> * <pre class="code">
* Assert.noNullElements(array, ()->{ * Assert.noNullElements(array, ()->{
* // to query relation message * // to query relation message
* return "relation message to return "; * return new IllegalArgumentException("relation message to return ");
* }); * });
* </pre> * </pre>
* *
* @param <T> 数组元素类型 * @param <T> 数组元素类型
* @param array 被检查的数组 * @param array 被检查的数组
* @param errorMsgSupplier 错误抛出异常附带的消息生产接口 * @param errorSupplier 错误抛出异常附带的消息生产接口
* @return 被检查的数组 * @return 被检查的数组
* @throws IllegalArgumentException if the object array contains a {@code null} element * @throws X if the object array contains a {@code null} element
* @see ArrayUtil#hasNull(Object[])
* @since 5.4.5
*/ */
public static <T> T[] noNullElements(T[] array, Supplier<String> errorMsgSupplier) throws IllegalArgumentException { public static <T, X extends Throwable> T[] noNullElements(T[] array, Supplier<X> errorSupplier) throws X {
if (ArrayUtil.hasNull(array)) { if (ArrayUtil.hasNull(array)) {
throw new IllegalArgumentException(errorMsgSupplier.get()); throw errorSupplier.get();
} }
return array; return array;
} }
/** /**
* 断言给定数组是否不包含{@code null}元素如果数组为空或 {@code null}将被认为不包含 * 断言给定数组是否不包含{@code null}元素如果数组为空或 {@code null}将被认为不包含
* *
@ -519,10 +515,7 @@ public class Assert {
* @throws IllegalArgumentException if the object array contains a {@code null} element * @throws IllegalArgumentException if the object array contains a {@code null} element
*/ */
public static <T> T[] noNullElements(T[] array, String errorMsgTemplate, Object... params) throws IllegalArgumentException { public static <T> T[] noNullElements(T[] array, String errorMsgTemplate, Object... params) throws IllegalArgumentException {
if (ArrayUtil.hasNull(array)) { return noNullElements(array, () -> new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params)));
throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
}
return array;
} }
/** /**
@ -540,28 +533,34 @@ public class Assert {
public static <T> T[] noNullElements(T[] array) throws IllegalArgumentException { public static <T> T[] noNullElements(T[] array) throws IllegalArgumentException {
return noNullElements(array, "[Assertion failed] - this array must not contain any null elements"); return noNullElements(array, "[Assertion failed] - this array must not contain any null elements");
} }
/** /**
* 断言给定集合非空 * 断言给定集合非空
* 并使用指定的函数获取错误信息返回 * 并使用指定的函数获取错误信息返回
* <pre class="code"> * <pre class="code">
* Assert.notEmpty(collection, ()->{ * Assert.notEmpty(collection, ()->{
* // to query relation message * // to query relation message
* return "relation message to return "; * return new IllegalArgumentException("relation message to return");
* }); * });
* </pre> * </pre>
* *
* @param <T> 集合元素类型 * @param <E> 集合元素类型
* @param <T> 集合类型
* @param <X> 异常类型
* @param collection 被检查的集合 * @param collection 被检查的集合
* @param errorMsgSupplier 错误抛出异常附带的消息生产接口 * @param errorSupplier 错误抛出异常附带的消息生产接口
* @return 非空集合 * @return 非空集合
* @throws IllegalArgumentException if the collection is {@code null} or has no elements * @throws X if the collection is {@code null} or has no elements
* @see CollUtil#isNotEmpty(Iterable)
* @since 5.4.5
*/ */
public static <T> Collection<T> notEmpty(Collection<T> collection, Supplier<String> errorMsgSupplier) throws IllegalArgumentException { public static <E, T extends Iterable<E>, X extends Throwable> T notEmpty(T collection, Supplier<X> errorSupplier) throws X {
if (CollUtil.isEmpty(collection)) { if (CollUtil.isEmpty(collection)) {
throw new IllegalArgumentException(errorMsgSupplier.get()); throw errorSupplier.get();
} }
return collection; return collection;
} }
/** /**
* 断言给定集合非空 * 断言给定集合非空
* *
@ -569,18 +568,16 @@ public class Assert {
* Assert.notEmpty(collection, "Collection must have elements"); * Assert.notEmpty(collection, "Collection must have elements");
* </pre> * </pre>
* *
* @param <T> 集合元素类型 * @param <E> 集合元素类型
* @param <T> 集合类型
* @param collection 被检查的集合 * @param collection 被检查的集合
* @param errorMsgTemplate 异常时的消息模板 * @param errorMsgTemplate 异常时的消息模板
* @param params 参数列表 * @param params 参数列表
* @return 非空集合 * @return 非空集合
* @throws IllegalArgumentException if the collection is {@code null} or has no elements * @throws IllegalArgumentException if the collection is {@code null} or has no elements
*/ */
public static <T> Collection<T> notEmpty(Collection<T> collection, String errorMsgTemplate, Object... params) throws IllegalArgumentException { public static <E, T extends Iterable<E>> T notEmpty(T collection, String errorMsgTemplate, Object... params) throws IllegalArgumentException {
if (CollUtil.isEmpty(collection)) { return notEmpty(collection, () -> new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params)));
throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
}
return collection;
} }
/** /**
@ -590,57 +587,40 @@ public class Assert {
* Assert.notEmpty(collection); * Assert.notEmpty(collection);
* </pre> * </pre>
* *
* @param <T> 集合元素类型 * @param <E> 集合元素类型
* @param <T> 集合类型
* @param collection 被检查的集合 * @param collection 被检查的集合
* @return 被检查集合 * @return 被检查集合
* @throws IllegalArgumentException if the collection is {@code null} or has no elements * @throws IllegalArgumentException if the collection is {@code null} or has no elements
*/ */
public static <T> Collection<T> notEmpty(Collection<T> collection) throws IllegalArgumentException { public static <E, T extends Iterable<E>> T notEmpty(T collection) throws IllegalArgumentException {
return notEmpty(collection, "[Assertion failed] - this collection must not be empty: it must contain at least 1 element"); return notEmpty(collection, "[Assertion failed] - this collection must not be empty: it must contain at least 1 element");
} }
/** /**
* 断言给定Map非空 * 断言给定Map非空
* 并使用指定的函数获取错误信息返回 * 并使用指定的函数获取错误信息返回
* <pre class="code"> * <pre class="code">
* Assert.notEmpty(map, ()->{ * Assert.notEmpty(map, ()->{
* // to query relation message * // to query relation message
* return "relation message to return "; * return new IllegalArgumentException("relation message to return");
* }); * });
* </pre> * </pre>
* *
* @param <K> Key类型 * @param <K> Key类型
* @param <V> Value类型 * @param <V> Value类型
* * @param <T> Map类型
* @param <X> 异常类型
* @param map 被检查的Map * @param map 被检查的Map
* @param errorMsgSupplier 错误抛出异常附带的消息生产接口 * @param errorSupplier 错误抛出异常附带的消息生产接口
* @return 被检查的Map * @return 被检查的Map
* @throws IllegalArgumentException if the map is {@code null} or has no entries * @throws X if the map is {@code null} or has no entries
* @see MapUtil#isNotEmpty(Map)
* @since 5.4.5
*/ */
public static <K, V> Map<K, V> notEmpty(Map<K, V> map, Supplier<String> errorMsgSupplier) throws IllegalArgumentException { public static <K, V, T extends Map<K, V>, X extends Throwable> T notEmpty(T map, Supplier<X> errorSupplier) throws X {
if (CollUtil.isEmpty(map)) { if (MapUtil.isEmpty(map)) {
throw new IllegalArgumentException(errorMsgSupplier.get()); throw errorSupplier.get();
}
return map;
}
/**
* 断言给定Map非空
*
* <pre class="code">
* Assert.notEmpty(map, "Map must have entries");
* </pre>
*
* @param <K> Key类型
* @param <V> Value类型
*
* @param map 被检查的Map
* @param errorMsgTemplate 异常时的消息模板
* @param params 参数列表
* @return 被检查的Map
* @throws IllegalArgumentException if the map is {@code null} or has no entries
*/
public static <K, V> Map<K, V> notEmpty(Map<K, V> map, String errorMsgTemplate, Object... params) throws IllegalArgumentException {
if (CollUtil.isEmpty(map)) {
throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
} }
return map; return map;
} }
@ -654,12 +634,32 @@ public class Assert {
* *
* @param <K> Key类型 * @param <K> Key类型
* @param <V> Value类型 * @param <V> Value类型
* @param <T> Map类型
* @param map 被检查的Map
* @param errorMsgTemplate 异常时的消息模板
* @param params 参数列表
* @return 被检查的Map
* @throws IllegalArgumentException if the map is {@code null} or has no entries
*/
public static <K, V, T extends Map<K, V>> T notEmpty(T map, String errorMsgTemplate, Object... params) throws IllegalArgumentException {
return notEmpty(map, () -> new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params)));
}
/**
* 断言给定Map非空
* *
* <pre class="code">
* Assert.notEmpty(map, "Map must have entries");
* </pre>
*
* @param <K> Key类型
* @param <V> Value类型
* @param <T> Map类型
* @param map 被检查的Map * @param map 被检查的Map
* @return 被检查的Map * @return 被检查的Map
* @throws IllegalArgumentException if the map is {@code null} or has no entries * @throws IllegalArgumentException if the map is {@code null} or has no entries
*/ */
public static <K, V> Map<K, V> notEmpty(Map<K, V> map) throws IllegalArgumentException { public static <K, V, T extends Map<K, V>> T notEmpty(T map) throws IllegalArgumentException {
return notEmpty(map, "[Assertion failed] - this map must not be empty; it must contain at least one entry"); return notEmpty(map, "[Assertion failed] - this map must not be empty; it must contain at least one entry");
} }
@ -739,6 +739,7 @@ public class Assert {
throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params)); throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
} }
} }
/** /**
* 检查boolean表达式当检查结果为false时抛出 {@code IllegalStateException} * 检查boolean表达式当检查结果为false时抛出 {@code IllegalStateException}
* 并使用指定的函数获取错误信息返回 * 并使用指定的函数获取错误信息返回
@ -758,6 +759,7 @@ public class Assert {
throw new IllegalStateException(errorMsgSupplier.get()); throw new IllegalStateException(errorMsgSupplier.get());
} }
} }
/** /**
* 检查boolean表达式当检查结果为false时抛出 {@code IllegalStateException} * 检查boolean表达式当检查结果为false时抛出 {@code IllegalStateException}
* *
@ -902,6 +904,7 @@ public class Assert {
} }
// -------------------------------------------------------------------------------------------------------------------------------------------- Private method start // -------------------------------------------------------------------------------------------------------------------------------------------- Private method start
/** /**
* 错误的下标时显示的消息 * 错误的下标时显示的消息
* *

View File

@ -18,12 +18,21 @@ public class AssertTest {
@Test(expected = IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class)
public void isTrueTest() { public void isTrueTest() {
int i = 0; int i = 0;
//noinspection ConstantConditions
cn.hutool.core.lang.Assert.isTrue(i > 0, IllegalArgumentException::new); cn.hutool.core.lang.Assert.isTrue(i > 0, IllegalArgumentException::new);
} }
@Test(expected = IndexOutOfBoundsException.class) @Test(expected = IndexOutOfBoundsException.class)
public void isTrueTest2() { public void isTrueTest2() {
int i = -1; int i = -1;
//noinspection ConstantConditions
cn.hutool.core.lang.Assert.isTrue(i >= 0, IndexOutOfBoundsException::new); cn.hutool.core.lang.Assert.isTrue(i >= 0, IndexOutOfBoundsException::new);
} }
@Test(expected = IndexOutOfBoundsException.class)
public void isTrueTest3() {
int i = -1;
//noinspection ConstantConditions
Assert.isTrue(i > 0, ()-> new IndexOutOfBoundsException("relation message to return"));
}
} }

View File

@ -1,5 +1,7 @@
package cn.hutool.json; package cn.hutool.json;
import cn.hutool.core.util.StrUtil;
import java.io.Serializable; import java.io.Serializable;
/** /**
@ -39,6 +41,6 @@ public class JSONNull implements Serializable{
*/ */
@Override @Override
public String toString() { public String toString() {
return "null"; return StrUtil.NULL;
} }
} }

View File

@ -214,4 +214,10 @@ public class ExcelReadTest {
reader.read((cell, value)-> Console.log("{}, {} {}", cell.getRowIndex(), cell.getColumnIndex(), value)); reader.read((cell, value)-> Console.log("{}, {} {}", cell.getRowIndex(), cell.getColumnIndex(), value));
} }
@Test
public void readTest() {
final ExcelReader reader = ExcelUtil.getReader("d:/test/人员体检信息表.xlsx");
final List<List<Object>> read = reader.read();
// Console.log(read);
}
} }