diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/util/EnumUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/util/EnumUtil.java index 0025a22f4..b319fc2dc 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/util/EnumUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/util/EnumUtil.java @@ -12,6 +12,7 @@ package org.dromara.hutool.core.util; +import org.dromara.hutool.core.collection.CollUtil; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.func.LambdaUtil; import org.dromara.hutool.core.func.SerFunction; @@ -39,8 +40,7 @@ public class EnumUtil { * @return 是否为Enum类 */ public static boolean isEnum(final Class clazz) { - Assert.notNull(clazz); - return clazz.isEnum(); + return Assert.notNull(clazz).isEnum(); } /** @@ -50,8 +50,7 @@ public class EnumUtil { * @return 是否为Enum类 */ public static boolean isEnum(final Object obj) { - Assert.notNull(obj); - return obj.getClass().isEnum(); + return Assert.notNull(obj).getClass().isEnum(); } /** @@ -74,8 +73,14 @@ public class EnumUtil { * @return 枚举值,null表示无此对应枚举 * @since 5.1.6 */ - public static > E getEnumAt(final Class enumClass, final int index) { + public static > E getEnumAt(final Class enumClass, int index) { + if (null == enumClass) { + return null; + } final E[] enumConstants = enumClass.getEnumConstants(); + if (index < 0) { + index = enumConstants.length + index; + } return index >= 0 && index < enumConstants.length ? enumConstants[index] : null; } @@ -89,9 +94,29 @@ public class EnumUtil { * @since 4.1.13 */ public static > E fromString(final Class enumClass, final String value) { + if (null == enumClass || StrUtil.isBlank(value)) { + return null; + } return Enum.valueOf(enumClass, value); } + /** + * 字符串转枚举,调用{@link Enum#valueOf(Class, String)},转换失败返回{@code null} 而非报错 + * + * @param 枚举类型泛型 + * @param enumClass 枚举类 + * @param value 值 + * @return 枚举值 + * @since 4.5.18 + */ + public static > E fromStringQuietly(final Class enumClass, final String value) { + try { + return fromString(enumClass, value); + } catch (final IllegalArgumentException e) { + return null; + } + } + /** * 字符串转枚举,调用{@link Enum#valueOf(Class, String)}
* 如果无枚举值,返回默认值 @@ -107,27 +132,6 @@ public class EnumUtil { return ObjUtil.defaultIfNull(fromStringQuietly(enumClass, value), defaultValue); } - /** - * 字符串转枚举,调用{@link Enum#valueOf(Class, String)},转换失败返回{@code null} 而非报错 - * - * @param 枚举类型泛型 - * @param enumClass 枚举类 - * @param value 值 - * @return 枚举值 - * @since 4.5.18 - */ - public static > E fromStringQuietly(final Class enumClass, final String value) { - if (null == enumClass || StrUtil.isBlank(value)) { - return null; - } - - try { - return fromString(enumClass, value); - } catch (final IllegalArgumentException e) { - return null; - } - } - /** * 模糊匹配转换为枚举,给定一个值,匹配枚举中定义的所有字段名(包括name属性),一旦匹配到返回这个枚举对象,否则返回null * @@ -138,6 +142,9 @@ public class EnumUtil { */ @SuppressWarnings("unchecked") public static > E likeValueOf(final Class enumClass, Object value) { + if (null == enumClass || null == value) { + return null; + } if (value instanceof CharSequence) { value = value.toString().trim(); } @@ -147,7 +154,7 @@ public class EnumUtil { String fieldName; for (final Field field : fields) { fieldName = field.getName(); - if (field.getType().isEnum() || "ENUM$VALUES".equals(fieldName) || "ordinal".equals(fieldName)) { + if (field.getType().isEnum() || StrUtil.equalsAny("ENUM$VALUES", "ordinal", fieldName)) { // 跳过一些特殊字段 continue; } @@ -167,6 +174,9 @@ public class EnumUtil { * @return name列表 */ public static List getNames(final Class> clazz) { + if (null == clazz) { + return null; + } final Enum[] enums = clazz.getEnumConstants(); if (null == enums) { return null; @@ -186,6 +196,9 @@ public class EnumUtil { * @return 字段值列表 */ public static List getFieldValues(final Class> clazz, final String fieldName) { + if (null == clazz || StrUtil.isBlank(fieldName)) { + return null; + } final Enum[] enums = clazz.getEnumConstants(); if (null == enums) { return null; @@ -210,6 +223,9 @@ public class EnumUtil { * @since 4.1.20 */ public static List getFieldNames(final Class> clazz) { + if (null == clazz) { + return null; + } final List names = new ArrayList<>(); final Field[] fields = FieldUtil.getFields(clazz); String name; @@ -235,8 +251,11 @@ public class EnumUtil { * @since 5.8.0 */ public static > E getBy(final Class enumClass, final Predicate predicate) { + if (null == enumClass || null == predicate) { + return null; + } return Arrays.stream(enumClass.getEnumConstants()) - .filter(predicate).findFirst().orElse(null); + .filter(predicate).findFirst().orElse(null); } /** @@ -249,11 +268,14 @@ public class EnumUtil { * @return 对应枚举 ,获取不到时为 {@code null} */ public static , C> E getBy(final SerFunction condition, final C value) { - Class implClass = LambdaUtil.getRealClass(condition); - if (Enum.class.equals(implClass)) { - implClass = LambdaUtil.getRealClass(condition); + if(null == condition){ + return null; } - return Arrays.stream(implClass.getEnumConstants()).filter(e -> condition.apply(e).equals(value)).findAny().orElse(null); + final Class implClass = LambdaUtil.getRealClass(condition); + return Arrays.stream(implClass.getEnumConstants()) + .filter(constant -> ObjUtil.equals(condition.apply(constant), value)) + .findAny() + .orElse(null); } /** @@ -284,15 +306,19 @@ public class EnumUtil { */ public static , F, C> F getFieldBy(final SerFunction field, final Function condition, final C value) { + if(null == field || null == condition){ + return null; + } Class implClass = LambdaUtil.getRealClass(field); if (Enum.class.equals(implClass)) { implClass = LambdaUtil.getRealClass(field); } return Arrays.stream(implClass.getEnumConstants()) - // 过滤 - .filter(e -> condition.apply(e).equals(value)) - // 获取第一个并转换为结果 - .findFirst().map(field).orElse(null); + // 过滤 + .filter(constant -> ObjUtil.equals(condition.apply(constant), value)) + // 获取第一个并转换为结果 + .findFirst().map(field) + .orElse(null); } /** @@ -305,6 +331,9 @@ public class EnumUtil { * @since 4.0.2 */ public static > LinkedHashMap getEnumMap(final Class enumClass) { + if(null == enumClass){ + return null; + } final LinkedHashMap map = new LinkedHashMap<>(); for (final E e : enumClass.getEnumConstants()) { map.put(e.name(), e); @@ -321,6 +350,9 @@ public class EnumUtil { * @return 枚举名对应指定字段值的Map */ public static Map getNameFieldMap(final Class> clazz, final String fieldName) { + if(null == clazz || StrUtil.isBlank(fieldName)){ + return null; + } final Enum[] enums = clazz.getEnumConstants(); Assert.notNull(enums, "Class [{}] is not an Enum type!", clazz); final Map map = MapUtil.newHashMap(enums.length, true); @@ -339,7 +371,11 @@ public class EnumUtil { * @return 是否存在 */ public static > boolean contains(final Class enumClass, final String name) { - return getEnumMap(enumClass).containsKey(name); + final LinkedHashMap enumMap = getEnumMap(enumClass); + if(CollUtil.isEmpty(enumMap)){ + return false; + } + return enumMap.containsKey(name); } /** diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/util/IssueI9NSZ4Test.java b/hutool-core/src/test/java/org/dromara/hutool/core/util/IssueI9NSZ4Test.java new file mode 100644 index 000000000..7976efd62 --- /dev/null +++ b/hutool-core/src/test/java/org/dromara/hutool/core/util/IssueI9NSZ4Test.java @@ -0,0 +1,88 @@ +package org.dromara.hutool.core.util; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.ToString; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class IssueI9NSZ4Test { + @Test + public void getByTest() { + // AnimalKindInZoo所有枚举结果的getMappedValue结果值中都无AnimalKind.DOG,返回null + final AnimalKindInZoo by = EnumUtil.getBy(AnimalKindInZoo::getMappedValue, AnimalKind.DOG); + Assertions.assertNull(by); + } + + @Test + public void getByTest2() { + final AnimalKindInZoo by = EnumUtil.getBy(AnimalKindInZoo::getMappedValue, AnimalKind.BIRD); + Assertions.assertEquals(AnimalKindInZoo.BIRD, by); + } + + /** + * 动物类型 + */ + @Getter + @ToString + @AllArgsConstructor + public enum AnimalKind { + + /** + * 猫 + */ + CAT("cat", "猫"), + /** + * 狗 + */ + DOG("dog", "狗"), + /** + * 鸟 + */ + BIRD("bird", "鸟"); + + /** + * 键 + */ + private final String key; + /** + * 值 + */ + private final String value; + } + + /** + * 动物园里的动物类型 + */ + @Getter + @ToString + @AllArgsConstructor + public enum AnimalKindInZoo { + + /** + * 猫 + */ + CAT("cat", "猫", AnimalKind.CAT), + /** + * 蛇 + */ + SNAKE("snake", "蛇", null), + /** + * 鸟 + */ + BIRD("bird", "鸟", AnimalKind.BIRD); + + /** + * 键 + */ + private final String key; + /** + * 值 + */ + private final String value; + /** + * 映射值 + */ + private final AnimalKind mappedValue; + } +}