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 super T, ? extends R> 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);