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 cfec37eea..2f2dd4c6e 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
@@ -3,10 +3,8 @@ package cn.hutool.core.lang.func;
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;
@@ -57,18 +55,6 @@ public class LambdaUtil {
return resolve(func).getImplMethodName();
}
- /**
- * 获取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));
- }
-
/**
* 获取lambda表达式函数(方法)名称
*
@@ -82,16 +68,44 @@ public class LambdaUtil {
}
/**
- * 获取lambda实现类
+ * 通过对象的方法或类的静态方法引用,获取lambda实现类,两种情况匹配到此方法:
+ *
+ * - 对象方法引用,如:myTeacher::getAge
+ * - 类静态方法引用,如:MyTeacher::takeAge
+ *
+ * 如想获取调用的方法引用所在类,可以:
+ *
+ * // 返回MyTeacher.class
+ * LambdaUtil.getImplClass(myTeacher::getAge);
+ *
*
* @param func lambda
* @param 类型
* @return lambda实现类
+ * @since 5.8.0
*/
public static Class getImplClass(Func0> func) {
return ClassUtil.loadClass(resolve(func).getImplClass().replace(CharPool.SLASH, CharPool.DOT));
}
+ /**
+ * 通过类的方法引用,获取lambda实现类
+ * 类方法引用,相当于获取的方法引用是:MyTeacher.getAge(this)
+ * 如想获取调用的方法引用所在类,可以:
+ *
+ * // 返回MyTeacher.class
+ * LambdaUtil.getImplClass(MyTeacher::getAge);
+ *
+ *
+ * @param func lambda
+ * @param 类型
+ * @return lambda实现类
+ * @since 5.8.0
+ */
+ public static Class getImplClass(Func1 func) {
+ return ClassUtil.loadClass(resolve(func).getImplClass().replace(CharPool.SLASH, CharPool.DOT));
+ }
+
/**
* 获取lambda表达式Getter或Setter函数(方法)对应的字段名称,规则如下:
*
diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java
index 9cfee1744..0c346811c 100644
--- a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java
@@ -550,7 +550,7 @@ public class MapUtil {
* @since 5.0.4
*/
public static String sortJoin(Map, ?> params, String separator, String keyValueSeparator, boolean isIgnoreNull,
- String... otherParams) {
+ String... otherParams) {
return join(sort(params), separator, keyValueSeparator, isIgnoreNull, otherParams);
}
@@ -672,7 +672,7 @@ public class MapUtil {
/**
- * 变更
+ * 通过biFunction自定义一个规则,此规则将原Map中的元素转换成新的元素,生成新的Map返回
* 变更过程通过传入的 {@link BiFunction} 实现来返回一个值可以为不同类型的 {@link Map}
*
* @param map 原有的map
@@ -680,9 +680,10 @@ public class MapUtil {
* @param {@code key}的类型
* @param {@code value}的类型
* @param 新的,修改后的{@code value}的类型
- * @return 值可以为不同类型的 {@link Map}
+ * @return 值可以为不同类型的 {@link Map
+ * @since 5.8.0
*/
- public static Map change(Map map, BiFunction biFunction) {
+ public static Map map(Map map, BiFunction biFunction) {
if (null == map || null == biFunction) {
return MapUtil.newHashMap();
}
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 b7adbe0f1..4d483fb08 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
@@ -221,7 +221,7 @@ public class EnumUtil {
* @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);
+ return Arrays.stream(LambdaUtil.getImplClass(condition).getEnumConstants()).filter(e -> condition.callWithRuntimeException(e).equals(value)).findAny().orElse(null);
}
/**
@@ -236,7 +236,7 @@ public class EnumUtil {
* @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);
+ return Arrays.stream(LambdaUtil.getImplClass(condition).getEnumConstants()).filter(e -> condition.callWithRuntimeException(e).equals(value)).findAny().map(field).orElse(null);
}
/**
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 d78f385ee..98075609c 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
@@ -1,10 +1,9 @@
package cn.hutool.core.lang.func;
+import lombok.Data;
import org.junit.Assert;
import org.junit.Test;
-import lombok.Data;
-
public class LambdaUtilTest {
@Test
@@ -21,19 +20,29 @@ public class LambdaUtilTest {
@Test
public void getImplClassTest() {
- // 一般用于封装工具类时减少参数使用
- Class aClass = LambdaUtil.getInstantiatedClass(MyTeacher::getAge);
+ // 类方法引用,相当于获取的方法引用是:MyTeacher.getAge(this)
+ // 因此此处会匹配到Func1,其参数就是this
+ Class aClass = LambdaUtil.getImplClass(MyTeacher::getAge);
Assert.assertEquals(MyTeacher.class, aClass);
- // 一般用于封装工具类时减少参数使用
MyTeacher myTeacher = new MyTeacher();
- Class bClass = LambdaUtil.getImplClass(myTeacher::getAge);
- Assert.assertEquals(MyTeacher.class, bClass);
+
+ // 对象方法引用,因为已经有了对象,因此此处引用相当于获取:myTeacher.getAge()
+ aClass = LambdaUtil.getImplClass(myTeacher::getAge);
+ Assert.assertEquals(MyTeacher.class, aClass);
+
+ // 静态方法引用,相当于获取:MyTeader.takeAge
+ aClass = LambdaUtil.getImplClass(MyTeacher::takeAge);
+ Assert.assertEquals(MyTeacher.class, aClass);
}
@Data
static class MyTeacher {
+ public static String takeAge(){
+ return new MyTeacher().getAge();
+ }
+
public String age;
}
}
diff --git a/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java
index 58ce564a1..e1aed546e 100644
--- a/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java
@@ -56,7 +56,7 @@ public class MapUtilTest {
}
@Test
- public void changeTest() {
+ public void mapTest() {
// Add test like a foreigner
Map adjectivesMap = MapUtil.builder()
.put(0, "lovely")
@@ -64,7 +64,7 @@ public class MapUtilTest {
.put(2, "happily")
.build();
- Map resultMap = MapUtil.change(adjectivesMap, (k, v) -> v + " " + PeopleEnum.values()[k].name().toLowerCase());
+ Map resultMap = MapUtil.map(adjectivesMap, (k, v) -> v + " " + PeopleEnum.values()[k].name().toLowerCase());
Assert.assertEquals("lovely girl", resultMap.get(0));
Assert.assertEquals("friendly boy", resultMap.get(1));
@@ -80,7 +80,7 @@ public class MapUtilTest {
Map> groupIdUserIdsMap = groups.stream().flatMap(group -> idUserMap.keySet().stream().map(userId -> UserGroup.builder().groupId(group.getId()).userId(userId).build())).collect(Collectors.groupingBy(UserGroup::getUserId, Collectors.mapping(UserGroup::getGroupId, Collectors.toList())));
// 神奇的魔法发生了, 分组id和用户ids组成的map,竟然变成了订单编号和用户实体集合组成的map
- Map> groupIdUserMap = MapUtil.change(groupIdUserIdsMap, (groupId, userIds) -> userIds.stream().map(idUserMap::get).collect(Collectors.toList()));
+ Map> groupIdUserMap = MapUtil.map(groupIdUserIdsMap, (groupId, userIds) -> userIds.stream().map(idUserMap::get).collect(Collectors.toList()));
// 然后你就可以拿着这个map,去封装groups,使其能够在订单数据带出客户信息啦
groups.forEach(group -> Opt.ofNullable(group.getId()).map(groupIdUserMap::get).ifPresent(group::setUsers));