From 5fdabe844edd5c8a11197bd76d18adf642f71969 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 16 Mar 2022 22:33:33 +0800 Subject: [PATCH] add method --- CHANGELOG.md | 1 + .../java/cn/hutool/core/bean/BeanUtil.java | 23 +++++++ .../main/java/cn/hutool/core/lang/Dict.java | 15 +++-- .../cn/hutool/core/lang/func/LambdaUtil.java | 60 ++++++++++++------- .../main/java/cn/hutool/core/map/MapUtil.java | 20 +++---- .../java/cn/hutool/core/lang/DictTest.java | 6 +- 6 files changed, 88 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8456e3fa1..f50f7bb91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ * 【db 】 增加MongoDB4.x支持(pr#568@Gitee) * 【core 】 FileAppender优化初始List大小(pr#2197@Github) * 【core 】 Base32增加pad支持(pr#2195@Github) +* 【core 】 Dict增加setFields方法(pr#578@Gitee) * ### 🐞Bug修复 * 【core 】 修复ObjectUtil.hasNull传入null返回true的问题(pr#555@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java index 84e7c5917..3f0428f84 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -915,4 +915,27 @@ public class BeanUtil { return false; } + /** + * 获取Getter或Setter方法名对应的字段名称,规则如下: + * + * + * @param getterOrSetterName Getter或Setter方法名 + * @return 字段名称 + * @throws IllegalArgumentException 非Getter或Setter方法 + * @since 5.7.23 + */ + public static String getFieldName(String getterOrSetterName) { + if (getterOrSetterName.startsWith("get") || getterOrSetterName.startsWith("set")) { + return StrUtil.removePreAndLowerFirst(getterOrSetterName, 3); + } else if (getterOrSetterName.startsWith("is")) { + return StrUtil.removePreAndLowerFirst(getterOrSetterName, 2); + } else { + throw new IllegalArgumentException("Invalid Getter or Setter name: " + getterOrSetterName); + } + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Dict.java b/hutool-core/src/main/java/cn/hutool/core/lang/Dict.java index 9a5310e29..058aeba4c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Dict.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Dict.java @@ -5,6 +5,8 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.getter.BasicTypeGetter; +import cn.hutool.core.lang.func.Func0; +import cn.hutool.core.lang.func.LambdaUtil; import java.math.BigDecimal; import java.math.BigInteger; @@ -17,8 +19,6 @@ import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; import java.util.Objects; -import cn.hutool.core.lang.func.Func0; -import cn.hutool.core.lang.func.LambdaUtil; /** * 字典对象,扩充了HashMap中的方法 @@ -526,7 +526,7 @@ public class Dict extends LinkedHashMap implements BasicTypeGett * person.friends[5].name * * - * @param 目标类型 + * @param 目标类型 * @param expression 表达式 * @return 对象 * @see BeanPath#get(Object) @@ -601,9 +601,16 @@ public class Dict extends LinkedHashMap implements BasicTypeGett } /** - * 通过lambda批量设置值 + * 通过lambda批量设置值
+ * 实际使用时,可以使用getXXX的方法引用来完成键值对的赋值: + *
+	 *     User user = GenericBuilder.of(User::new).with(User::setUsername, "hutool").build();
+	 *     Dict.create().setFields(user::getNickname, user::getUsername);
+	 * 
+ * * @param fields lambda,不能为空 * @return this + * @since 5.7.23 */ public Dict setFields(Func0... fields) { Arrays.stream(fields).forEach(f -> set(LambdaUtil.getFieldName(f), f.callWithRuntimeException())); 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 c204775f2..c57a41f47 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,8 +1,8 @@ package cn.hutool.core.lang.func; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.SimpleCache; import cn.hutool.core.util.ReflectUtil; -import cn.hutool.core.util.StrUtil; import java.io.Serializable; import java.lang.invoke.SerializedLambda; @@ -29,6 +29,15 @@ public class LambdaUtil { return _resolve(func); } + /** + * 解析lambda表达式,加了缓存。 + * 该缓存可能会在任意不定的时间被清除 + * + * @param Lambda返回类型 + * @param func 需要解析的 lambda 对象(无参方法) + * @return 返回解析后的结果 + * @since 5.7.23 + */ public static SerializedLambda resolve(Func0 func) { return _resolve(func); } @@ -36,14 +45,22 @@ public class LambdaUtil { /** * 获取lambda表达式函数(方法)名称 * - * @param Lambda类型 + * @param

Lambda参数类型 * @param func 函数(无参方法) * @return 函数名称 */ - public static String getMethodName(Func1 func) { + public static

String getMethodName(Func1 func) { return resolve(func).getImplMethodName(); } + /** + * 获取lambda表达式函数(方法)名称 + * + * @param Lambda返回类型 + * @param func 函数(无参方法) + * @return 函数名称 + * @since 5.7.23 + */ public static String getMethodName(Func0 func) { return resolve(func).getImplMethodName(); } @@ -59,30 +76,31 @@ public class LambdaUtil { * * @param Lambda类型 * @param func 函数(无参方法) - * @return 函数名称 + * @return 方法名称 * @throws IllegalArgumentException 非Getter或Setter方法 * @since 5.7.10 */ public static String getFieldName(Func1 func) throws IllegalArgumentException { - final String methodName = getMethodName(func); - if (methodName.startsWith("get") || methodName.startsWith("set")) { - return StrUtil.removePreAndLowerFirst(methodName, 3); - } else if (methodName.startsWith("is")) { - return StrUtil.removePreAndLowerFirst(methodName, 2); - } else { - throw new IllegalArgumentException("Invalid Getter or Setter name: " + methodName); - } + return BeanUtil.getFieldName(getMethodName(func)); } - public static String getFieldName(Func0 func) throws IllegalArgumentException { - final String methodName = getMethodName(func); - if (methodName.startsWith("get") || methodName.startsWith("set")) { - return StrUtil.removePreAndLowerFirst(methodName, 3); - } else if (methodName.startsWith("is")) { - return StrUtil.removePreAndLowerFirst(methodName, 2); - } else { - throw new IllegalArgumentException("Invalid Getter or Setter name: " + methodName); - } + /** + * 获取lambda表达式Getter或Setter函数(方法)对应的字段名称,规则如下: + *

    + *
  • getXxxx获取为xxxx,如getName得到name。
  • + *
  • setXxxx获取为xxxx,如setName得到name。
  • + *
  • isXxxx获取为xxxx,如isName得到name。
  • + *
  • 其它不满足规则的方法名抛出{@link IllegalArgumentException}
  • + *
+ * + * @param Lambda类型 + * @param func 函数(无参方法) + * @return 方法名称 + * @throws IllegalArgumentException 非Getter或Setter方法 + * @since 5.7.23 + */ + public static String getFieldName(Func0 func) throws IllegalArgumentException { + return BeanUtil.getFieldName(getMethodName(func)); } /** 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 194777224..63b8c02b7 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 @@ -281,8 +281,8 @@ public class MapUtil { /** * 根据给定的Pair数组创建Map对象 * - * @param 键类型 - * @param 值类型 + * @param 键类型 + * @param 值类型 * @param pairs 键值对 * @return Map * @since 5.4.1 @@ -629,7 +629,7 @@ public class MapUtil { } Map map2 = ReflectUtil.newInstanceIfPossible(map.getClass()); - if(null == map2){ + if (null == map2) { map2 = new HashMap<>(map.size(), 1f); } if (isEmpty(map)) { @@ -662,7 +662,7 @@ public class MapUtil { * @since 3.1.0 */ public static Map filter(Map map, Filter> filter) { - if(null == map || null == filter){ + if (null == map || null == filter) { return map; } return edit(map, t -> filter.accept(t) ? t : null); @@ -680,12 +680,12 @@ public class MapUtil { */ @SuppressWarnings("unchecked") public static Map filter(Map map, K... keys) { - if(null == map || null == keys){ + if (null == map || null == keys) { return map; } Map map2 = ReflectUtil.newInstanceIfPossible(map.getClass()); - if(null == map2){ + if (null == map2) { map2 = new HashMap<>(map.size(), 1f); } if (isEmpty(map)) { @@ -792,9 +792,9 @@ public class MapUtil { /** * 按照值排序,可选是否倒序 * - * @param map 需要对值排序的map - * @param 键类型 - * @param 值类型 + * @param map 需要对值排序的map + * @param 键类型 + * @param 值类型 * @param isDesc 是否倒序 * @return 排序后新的Map * @since 5.5.8 @@ -802,7 +802,7 @@ public class MapUtil { public static > Map sortByValue(Map map, boolean isDesc) { Map result = new LinkedHashMap<>(); Comparator> entryComparator = Entry.comparingByValue(); - if(isDesc){ + if (isDesc) { entryComparator = entryComparator.reversed(); } map.entrySet().stream().sorted(entryComparator).forEachOrdered(e -> result.put(e.getKey(), e.getValue())); diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/DictTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/DictTest.java index ec9bd481d..81d595708 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/DictTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/DictTest.java @@ -1,13 +1,15 @@ package cn.hutool.core.lang; +import cn.hutool.core.builder.GenericBuilder; import cn.hutool.core.date.DateTime; import org.junit.Assert; import org.junit.Test; -import static cn.hutool.core.lang.OptTest.User; import java.util.HashMap; import java.util.Map; +import static cn.hutool.core.lang.OptTest.User; + public class DictTest { @Test public void dictTest(){ @@ -62,7 +64,7 @@ public class DictTest { @Test public void setFieldsTest() { - User user = User.builder().username("hutool").nickname(null).build(); + User user = GenericBuilder.of(User::new).with(User::setUsername, "hutool").build(); Dict dict = Dict.create(); dict.setFields(user::getNickname, user::getUsername); Assert.assertEquals("hutool", dict.get("username"));