diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayUtil.java index dcad79b6a..631ca9b85 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayUtil.java @@ -103,6 +103,7 @@ public class ArrayUtil extends PrimitiveArrayUtil { // ---------------------------------------------------------------------- isBlank + /** *
指定字符串数组中,是否包含空字符串。
*如果指定的字符串数组的长度为 0,或者其中的任意一个元素是空字符串,则返回 true。
@@ -1186,6 +1187,23 @@ public class ArrayUtil extends PrimitiveArrayUtil { return (E) ArrayWrapper.of(array).get(index); } + /** + * 获取满足条件的第一个元素 + * + * @param array 数组 + * @param predicate 条件 + * @param+ * 需要注意的是,以下两种格式不匹配,由{@link #findGetterAndSetter(String, Class, Method[], boolean)}完成: + *
- * 字段名 -》 方法名 - * isName -》 isName - * isName -》 isIsName - * isName -》 getIsName - * name -》 isName - * name -》 getName - *- * - * @param methodName 方法名 - * @param fieldName 字段名 - * @param isBooleanField 是否为Boolean类型字段 - * @param ignoreCase 匹配是否忽略大小写 - * @return 是否匹配 + * @param fieldName 字段名 + * @param gettersOrSetters 所有方法 + * @param ignoreCase 是否忽略大小写 + * @return 查找到的方法,{@code null}表示未找到 */ - private boolean isMatchGetter(String methodName, String fieldName, final boolean isBooleanField, final boolean ignoreCase) { - final String handledFieldName; - if (ignoreCase) { - // 全部转为小写,忽略大小写比较 - methodName = methodName.toLowerCase(); - handledFieldName = fieldName.toLowerCase(); - fieldName = handledFieldName; - } else { - handledFieldName = StrUtil.upperFirst(fieldName); - } + private Method findGetterForBoolean(final String fieldName, final Method[] gettersOrSetters, final boolean ignoreCase) { + // 查找isXXX + return ArrayUtil.get(gettersOrSetters, m -> { + if (0 != m.getParameterCount() || false == BooleanUtil.isBoolean(m.getReturnType())) { + // getter方法要求无参数且返回boolean或Boolean + return false; + } - // 针对Boolean类型特殊检查 - if (isBooleanField) { - if (fieldName.startsWith("is")) { - // 字段已经是is开头 - if (methodName.equals(fieldName) // isName -》 isName - || ("get" + handledFieldName).equals(methodName)// isName -》 getIsName - || ("is" + handledFieldName).equals(methodName)// isName -》 isIsName - ) { + if (StrUtil.startWith(fieldName, "is", ignoreCase)) { + // isName -》 isName + if(StrUtil.equals(fieldName, m.getName(), ignoreCase)){ return true; } - } else if (("is" + handledFieldName).equals(methodName)) { - // 字段非is开头, name -》 isName - return true; } - } - // 包括boolean的任何类型只有一种匹配情况:name -》 getName - return ("get" + handledFieldName).equals(methodName); + // name -》 isName + // isName -》 isIsName + return StrUtil.equals(StrUtil.upperFirstAndAddPre(fieldName, "is"), m.getName(), ignoreCase); + }); } /** - * 方法是否为Setter方法
+ * 需要注意的是,以下两种格式不匹配,由{@link #findGetterAndSetter(String, Class, Method[], boolean)}完成: + *
- * 字段名 -》 方法名 - * isName -》 setName - * isName -》 setIsName - * name -》 setName - *- * - * @param methodName 方法名 - * @param fieldName 字段名 - * @param isBooleanField 是否为Boolean类型字段 - * @param ignoreCase 匹配是否忽略大小写 - * @return 是否匹配 + * @param fieldName 字段名 + * @param gettersOrSetters 所有方法 + * @param ignoreCase 是否忽略大小写 + * @return 查找到的方法,{@code null}表示未找到 */ - private boolean isMatchSetter(String methodName, String fieldName, final boolean isBooleanField, final boolean ignoreCase) { - final String handledFieldName; - if (ignoreCase) { - // 全部转为小写,忽略大小写比较 - methodName = methodName.toLowerCase(); - handledFieldName = fieldName.toLowerCase(); - fieldName = handledFieldName; - } else { - handledFieldName = StrUtil.upperFirst(fieldName); - } - - // 非标准Setter方法跳过 - if (!methodName.startsWith("set")) { - return false; - } - - // 针对Boolean类型特殊检查 - if (isBooleanField && fieldName.startsWith("is")) { - // 字段是is开头 - if (("set" + StrUtil.removePrefix(fieldName, "is")).equals(methodName)// isName -》 setName - || ("set" + handledFieldName).equals(methodName)// isName -》 setIsName - ) { - return true; + private Method findSetterForBoolean(final String fieldName, final Method[] gettersOrSetters, final boolean ignoreCase) { + // 查找isXXX + return ArrayUtil.get(gettersOrSetters, m -> { + if (1 != m.getParameterCount() || false == BooleanUtil.isBoolean(m.getParameterTypes()[0])) { + // setter方法要求1个boolean或Boolean参数 + return false; } - } - // 包括boolean的任何类型只有一种匹配情况:name -》 setName - return ("set" + handledFieldName).equals(methodName); + if (StrUtil.startWith(fieldName, "is", ignoreCase)) { + // isName -》 setName + return StrUtil.equals( + "set" + StrUtil.removePrefix(fieldName, "is", ignoreCase), + m.getName(), ignoreCase); + } + + // 其它不匹配 + return false; + }); } // ------------------------------------------------------------------------------------------------------ Private method end } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java index 7815bafac..0b129c06d 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java @@ -1113,18 +1113,10 @@ public class CharSequenceUtil extends StrValidator { * * @param str 字符串 * @param prefix 前缀 - * @return 切掉后的字符串,若前缀不是 preffix, 返回原字符串 + * @return 切掉后的字符串,若前缀不是 prefix, 返回原字符串 */ public static String removePrefix(final CharSequence str, final CharSequence prefix) { - if (isEmpty(str) || isEmpty(prefix)) { - return str(str); - } - - final String str2 = str.toString(); - if (str2.startsWith(prefix.toString())) { - return subSuf(str2, prefix.length());// 截取后半段 - } - return str2; + return removePrefix(str, prefix, false); } /** @@ -1135,12 +1127,24 @@ public class CharSequenceUtil extends StrValidator { * @return 切掉后的字符串,若前缀不是 prefix, 返回原字符串 */ public static String removePrefixIgnoreCase(final CharSequence str, final CharSequence prefix) { + return removePrefix(str, prefix, true); + } + + /** + * 去掉指定前缀 + * + * @param str 字符串 + * @param prefix 前缀 + * @param ignoreCase 是否忽略大小写 + * @return 切掉后的字符串,若前缀不是 prefix, 返回原字符串 + */ + public static String removePrefix(final CharSequence str, final CharSequence prefix, final boolean ignoreCase) { if (isEmpty(str) || isEmpty(prefix)) { return str(str); } final String str2 = str.toString(); - if (startWithIgnoreCase(str, prefix)) { + if (startWith(str, prefix, ignoreCase)) { return subSuf(str2, prefix.length());// 截取后半段 } return str2;