修改Func1参数的方法为LambdaUtil#getInstantiatedClass

提供EnumUtil中对lambda进行映射处理
This commit is contained in:
VampireAchao 2022-03-23 22:27:38 +08:00
parent 2087ef8be7
commit c669426a1e
4 changed files with 81 additions and 19 deletions

View File

@ -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 <P> Class<P> getImplClass(Func1<P, ?> func) {
return ClassUtil.loadClass(resolve(func).getImplClass().replace(CharPool.SLASH, CharPool.DOT));
/**
* 获取lambda实现类
*
* @param func lambda
* @param <P> 类型
* @return lambda实现类
*/
public static <P> Class<P> getInstantiatedClass(Func1<P, ?> 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 <R> 类型
* @return lambda实现类
*/
public static <R> Class<R> getImplClass(Func0<?> func) {
return ClassUtil.loadClass(resolve(func).getImplClass().replace(CharPool.SLASH, CharPool.DOT));
}

View File

@ -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 <E> 枚举类型
* @param <C> 字段类型
* @return 对应枚举 获取不到时为 {@code null}
*/
public static <E extends Enum<E>, C> E getBy(Func1<E, C> 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 <E> 枚举类型
* @param <F> 想要获取的字段类型
* @param <C> 条件字段类型
* @return 对应枚举中另一字段值 获取不到时为 {@code null}
*/
public static <E extends Enum<E>, F, C> F getFieldBy(Function<E, F> field, Func1<E, C> condition, C value) {
return Arrays.stream(LambdaUtil.getInstantiatedClass(condition).getEnumConstants()).filter(e -> condition.callWithRuntimeException(e).equals(value)).findAny().map(field).orElse(null);
}
/**
* 获取枚举字符串值和枚举对象的Map对应使用LinkedHashMap保证有序<br>
* 结果中键为枚举名值为枚举对象

View File

@ -21,9 +21,11 @@ public class LambdaUtilTest {
@Test
public void getImplClassTest() {
Class<MyTeacher> aClass = LambdaUtil.getImplClass(MyTeacher::getAge);
// 一般用于封装工具类时减少参数使用
Class<MyTeacher> aClass = LambdaUtil.getInstantiatedClass(MyTeacher::getAge);
Assert.assertEquals(MyTeacher.class, aClass);
// 一般用于封装工具类时减少参数使用
MyTeacher myTeacher = new MyTeacher();
Class<MyTeacher> bClass = LambdaUtil.getImplClass(myTeacher::getAge);
Assert.assertEquals(MyTeacher.class, bClass);

View File

@ -34,6 +34,20 @@ public class EnumUtilTest {
Assert.assertTrue(names.contains("name"));
}
@Test
public void getByTest() {
// 枚举中字段互相映射使用
TestEnum testEnum = EnumUtil.getBy(TestEnum::getType, "type2");
Assert.assertEquals("TEST2", testEnum.name());
}
@Test
public void getFieldByTest() {
// 枚举中字段互相映射使用
String type = EnumUtil.getFieldBy(TestEnum::getType, TestEnum::ordinal, 1);
Assert.assertEquals("type2", type);
}
@Test
public void likeValueOfTest() {
TestEnum value = EnumUtil.likeValueOf(TestEnum.class, "type2");