diff --git a/hutool-core/src/main/java/cn/hutool/core/util/EnumUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/EnumUtil.java index a2bdec098..af9823f02 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/EnumUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/EnumUtil.java @@ -12,6 +12,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.function.Function; +import java.util.function.Predicate; /** * 枚举工具类 @@ -214,6 +215,19 @@ public class EnumUtil { return names; } + /** + * 通过 某字段对应值 获取 枚举,获取不到时为 {@code null} + * + * @param enumClass 枚举类 + * @param predicate 条件 + * @param 枚举类型 + * @return 对应枚举 ,获取不到时为 {@code null} + * @since 5.8.0 + */ + public static > E getBy(Class enumClass, Predicate predicate) { + return Arrays.stream(enumClass.getEnumConstants()) + .filter(predicate).findFirst().orElse(null); + } /** * 通过 某字段对应值 获取 枚举,获取不到时为 {@code null} @@ -225,7 +239,11 @@ public class EnumUtil { * @return 对应枚举 ,获取不到时为 {@code null} */ public static , C> E getBy(Func1 condition, C value) { - return Arrays.stream(LambdaUtil.getImplClass(condition).getEnumConstants()).filter(e -> condition.callWithRuntimeException(e).equals(value)).findAny().orElse(null); + Class implClass = LambdaUtil.getImplClass(condition); + if (Enum.class.equals(implClass)) { + implClass = LambdaUtil.getInstantiatedClass(condition); + } + return Arrays.stream(implClass.getEnumConstants()).filter(e -> condition.callWithRuntimeException(e).equals(value)).findAny().orElse(null); } /** @@ -243,7 +261,7 @@ public class EnumUtil { public static , F, C> F getFieldBy(Func1 field, Function condition, C value) { Class implClass = LambdaUtil.getImplClass(field); - if(Enum.class.equals(implClass)){ + if (Enum.class.equals(implClass)) { implClass = LambdaUtil.getInstantiatedClass(field); } return Arrays.stream(implClass.getEnumConstants()) diff --git a/hutool-core/src/test/java/cn/hutool/core/util/EnumUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/EnumUtilTest.java index aeeac4dc0..a085204cd 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/EnumUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/EnumUtilTest.java @@ -37,7 +37,7 @@ public class EnumUtilTest { @Test public void getByTest() { // 枚举中字段互相映射使用 - TestEnum testEnum = EnumUtil.getBy(TestEnum::getType, "type2"); + TestEnum testEnum = EnumUtil.getBy(TestEnum::ordinal, 1); Assert.assertEquals("TEST2", testEnum.name()); }