diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaUtil.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaUtil.java
index a2566eebe..cfec37eea 100644
--- a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaUtil.java
@@ -1,13 +1,15 @@
package cn.hutool.core.lang.func;
-import java.io.Serializable;
-import java.lang.invoke.SerializedLambda;
-
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.SimpleCache;
import cn.hutool.core.text.CharPool;
+import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.ReflectUtil;
+import cn.hutool.core.util.StrUtil;
+
+import java.io.Serializable;
+import java.lang.invoke.SerializedLambda;
/**
* Lambda相关工具类
@@ -55,8 +57,16 @@ public class LambdaUtil {
return resolve(func).getImplMethodName();
}
- public static
Class
getImplClass(Func1
func) {
- return ClassUtil.loadClass(resolve(func).getImplClass().replace(CharPool.SLASH, CharPool.DOT));
+ /**
+ * 获取lambda实现类
+ *
+ * @param func lambda
+ * @param
类型
+ * @return lambda实现类
+ */
+ public static
Class
getInstantiatedClass(Func1
func) {
+ String instantiatedMethodType = resolve(func).getInstantiatedMethodType();
+ return ClassUtil.loadClass(StrUtil.replace(StrUtil.sub(instantiatedMethodType, 2, StrUtil.indexOf(instantiatedMethodType, ';')), StrPool.SLASH, StrPool.DOT));
}
/**
@@ -71,6 +81,13 @@ public class LambdaUtil {
return resolve(func).getImplMethodName();
}
+ /**
+ * 获取lambda实现类
+ *
+ * @param func lambda
+ * @param 类型
+ * @return lambda实现类
+ */
public static Class getImplClass(Func0> func) {
return ClassUtil.loadClass(resolve(func).getImplClass().replace(CharPool.SLASH, CharPool.DOT));
}
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 4a1365d9e..b7adbe0f1 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
@@ -1,13 +1,13 @@
package cn.hutool.core.util;
import cn.hutool.core.lang.Assert;
+import cn.hutool.core.lang.func.Func1;
+import cn.hutool.core.lang.func.LambdaUtil;
import cn.hutool.core.map.MapUtil;
import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.function.Function;
/**
* 枚举工具类
@@ -210,6 +210,35 @@ public class EnumUtil {
return names;
}
+
+ /**
+ * 通过 某字段对应值 获取 枚举,获取不到时为 {@code null}
+ *
+ * @param condition 条件字段
+ * @param value 条件字段值
+ * @param 枚举类型
+ * @param 字段类型
+ * @return 对应枚举 ,获取不到时为 {@code null}
+ */
+ public static , C> E getBy(Func1 condition, C value) {
+ return Arrays.stream(LambdaUtil.getInstantiatedClass(condition).getEnumConstants()).filter(e -> condition.callWithRuntimeException(e).equals(value)).findAny().orElse(null);
+ }
+
+ /**
+ * 通过 某字段对应值 获取 枚举中另一字段值,获取不到时为 {@code null}
+ *
+ * @param field 你想要获取的字段
+ * @param condition 条件字段
+ * @param value 条件字段值
+ * @param 枚举类型
+ * @param 想要获取的字段类型
+ * @param 条件字段类型
+ * @return 对应枚举中另一字段值 ,获取不到时为 {@code null}
+ */
+ public static , F, C> F getFieldBy(Function field, Func1 condition, C value) {
+ return Arrays.stream(LambdaUtil.getInstantiatedClass(condition).getEnumConstants()).filter(e -> condition.callWithRuntimeException(e).equals(value)).findAny().map(field).orElse(null);
+ }
+
/**
* 获取枚举字符串值和枚举对象的Map对应,使用LinkedHashMap保证有序
* 结果中键为枚举名,值为枚举对象
diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaUtilTest.java
index 4c9697825..d78f385ee 100644
--- a/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaUtilTest.java
@@ -21,9 +21,11 @@ public class LambdaUtilTest {
@Test
public void getImplClassTest() {
- Class aClass = LambdaUtil.getImplClass(MyTeacher::getAge);
+ // 一般用于封装工具类时减少参数使用
+ Class aClass = LambdaUtil.getInstantiatedClass(MyTeacher::getAge);
Assert.assertEquals(MyTeacher.class, aClass);
+ // 一般用于封装工具类时减少参数使用
MyTeacher myTeacher = new MyTeacher();
Class bClass = LambdaUtil.getImplClass(myTeacher::getAge);
Assert.assertEquals(MyTeacher.class, bClass);
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 555d8f644..d95d2d963 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
@@ -9,7 +9,7 @@ import java.util.Map;
/**
* EnumUtil单元测试
- *
+ *
* @author looly
*
*/
@@ -20,39 +20,53 @@ public class EnumUtilTest {
List names = EnumUtil.getNames(TestEnum.class);
Assert.assertEquals(CollUtil.newArrayList("TEST1", "TEST2", "TEST3"), names);
}
-
+
@Test
public void getFieldValuesTest() {
List