diff --git a/CHANGELOG.md b/CHANGELOG.md index 28fed29e6..514df0d3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,13 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.0.M3 (2022-04-02) +# 5.8.0.M3 (2022-04-06) ### ❌不兼容特性 + ### 🐣新特性 +* 【core 】 CopyOptions支持以Lambda方式设置忽略属性列表(pr#590@Gitee) + ### 🐞Bug修复 ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java index 36ac56cec..fae88c2f3 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java @@ -7,13 +7,10 @@ import cn.hutool.core.util.ArrayUtil; import java.io.Serializable; import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; import java.util.Map; +import java.util.Set; import java.util.function.BiFunction; import java.util.function.BiPredicate; -import java.util.stream.Collectors; /** * 属性拷贝选项
@@ -167,27 +164,13 @@ public class CopyOptions implements Serializable { /** * 设置忽略的目标对象中属性列表,设置一个属性列表,不拷贝这些属性值,Lambda方式 * - * @param func1 忽略的目标对象中属性列表,设置一个属性列表,不拷贝这些属性值 + * @param funcs 忽略的目标对象中属性列表,设置一个属性列表,不拷贝这些属性值 * @return CopyOptions + * @since 5.8.0 */ - public CopyOptions setIgnoreProperties(Func1... func1) { - List ignoreProperties = Arrays.asList(func1) - .stream() - .map(t -> { - String name = LambdaUtil.getMethodName(t); - if (name.startsWith("is")) { - name = name.substring(2); - } else if (name.startsWith("get") || name.startsWith("set")) { - name = name.substring(3); - } else { - throw new RuntimeException("Error parsing property name '" + name + "'. Didn't start with 'is', 'get' or 'set'."); - } - if (name.length() == 1 || (name.length() > 1 && !Character.isUpperCase(name.charAt(1)))) { - name = name.substring(0, 1).toLowerCase(Locale.ENGLISH) + name.substring(1); - } - return name; - }) - .collect(Collectors.toList()); + @SuppressWarnings("unchecked") + public CopyOptions setIgnoreProperties(Func1... funcs) { + final Set ignoreProperties = ArrayUtil.mapToSet(funcs, LambdaUtil::getFieldName); return setPropertiesFilter((field, o) -> false == ignoreProperties.contains(field.getName())); } diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java index 876d140fa..95292a54f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java @@ -123,7 +123,9 @@ public class FileTypeUtil { } /** - * 根据文件流的头部信息获得文件类型 + * 根据文件流的头部信息获得文件类型
+ * 注意此方法会读取头部28个bytes,造成此流接下来读取时缺少部分bytes
+ * 因此如果想服用此流,流需支持{@link InputStream#reset()}方法。 * * @param in {@link InputStream} * @return 类型,文件的扩展名,未找到为{@code null} @@ -136,13 +138,16 @@ public class FileTypeUtil { /** * 根据文件流的头部信息获得文件类型 + * 注意此方法会读取头部28个bytes,造成此流接下来读取时缺少部分bytes
+ * 因此如果想服用此流,流需支持{@link InputStream#reset()}方法。 * *
 	 *     1、无法识别类型默认按照扩展名识别
 	 *     2、xls、doc、msi头信息无法区分,按照扩展名区分
 	 *     3、zip可能为docx、xlsx、pptx、jar、war、ofd头信息无法区分,按照扩展名区分
 	 * 
- * @param in {@link InputStream} + * + * @param in {@link InputStream} * @param filename 文件名 * @return 类型,文件的扩展名,未找到为{@code null} * @throws IORuntimeException 读取流引起的异常 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java index 399fe571d..4ba720987 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java @@ -382,10 +382,10 @@ public class ArrayUtil extends PrimitiveArrayUtil { */ @SuppressWarnings({"unchecked"}) public static T[] replace(T[] buffer, int index, T... values) { - if(isEmpty(values)){ + if (isEmpty(values)) { return buffer; } - if(isEmpty(buffer)){ + if (isEmpty(buffer)) { return values; } if (index < 0) { @@ -1673,7 +1673,7 @@ public class ArrayUtil extends PrimitiveArrayUtil { } /** - * 按照指定规则,将一种类型的数组元素提取后转换为List + * 按照指定规则,将一种类型的数组元素提取后转换为{@link List} * * @param array 被转换的数组 * @param func 转换规则函数 @@ -1686,6 +1686,20 @@ public class ArrayUtil extends PrimitiveArrayUtil { return Arrays.stream(array).map(func).collect(Collectors.toList()); } + /** + * 按照指定规则,将一种类型的数组元素提取后转换为{@link Set} + * + * @param array 被转换的数组 + * @param func 转换规则函数 + * @param 原数组类型 + * @param 目标数组类型 + * @return 转换后的数组 + * @since 5.8.0 + */ + public static Set mapToSet(T[] array, Function func) { + return Arrays.stream(array).map(func).collect(Collectors.toSet()); + } + /** * 判断两个数组是否相等,判断依据包括数组长度和每个元素都相等。 * diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java index 6d61c865e..6e9a687b7 100644 --- a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java @@ -564,11 +564,13 @@ public class BeanUtilTest { @Test public void copyBeanPropertiesFunctionFilterTest() { + //https://gitee.com/dromara/hutool/pulls/590 Person o = new Person(); o.setName("asd"); o.setAge(123); o.setOpenid("asd"); + @SuppressWarnings("unchecked") CopyOptions copyOptions = CopyOptions.create().setIgnoreProperties(Person::getAge,Person::getOpenid); Person n = new Person(); BeanUtil.copyProperties(o, n, copyOptions);