From 40bfd3940748d0dad3a27a55c937b19506d890c1 Mon Sep 17 00:00:00 2001 From: lqc <> Date: Mon, 4 Apr 2022 22:13:17 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=96=B0=E7=89=B9=E6=80=A7]=20CopyOptions?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BB=A5Lambda=E6=96=B9=E5=BC=8F=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=BF=BD=E7=95=A5=E5=B1=9E=E6=80=A7=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/bean/copier/CopyOptions.java | 33 +++++++++++++++++++ .../cn/hutool/core/bean/BeanUtilTest.java | 16 +++++++++ 2 files changed, 49 insertions(+) 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 198e1fdcf..36ac56cec 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 @@ -1,13 +1,19 @@ package cn.hutool.core.bean.copier; import cn.hutool.core.lang.Editor; +import cn.hutool.core.lang.func.Func1; +import cn.hutool.core.lang.func.LambdaUtil; 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.function.BiFunction; import java.util.function.BiPredicate; +import java.util.stream.Collectors; /** * 属性拷贝选项
@@ -158,6 +164,33 @@ public class CopyOptions implements Serializable { return setPropertiesFilter((field, o) -> false == ArrayUtil.contains(ignoreProperties, field.getName())); } + /** + * 设置忽略的目标对象中属性列表,设置一个属性列表,不拷贝这些属性值,Lambda方式 + * + * @param func1 忽略的目标对象中属性列表,设置一个属性列表,不拷贝这些属性值 + * @return CopyOptions + */ + 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()); + return setPropertiesFilter((field, o) -> false == ignoreProperties.contains(field.getName())); + } + /** * 设置是否忽略字段的注入错误 * 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 e86d34960..6d61c865e 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 @@ -562,6 +562,22 @@ public class BeanUtilTest { Assert.assertNull(newFood.getCode()); } + @Test + public void copyBeanPropertiesFunctionFilterTest() { + Person o = new Person(); + o.setName("asd"); + o.setAge(123); + o.setOpenid("asd"); + + CopyOptions copyOptions = CopyOptions.create().setIgnoreProperties(Person::getAge,Person::getOpenid); + Person n = new Person(); + BeanUtil.copyProperties(o, n, copyOptions); + + // 是否忽略拷贝属性 + Assert.assertNotEquals(o.getAge(),n.getAge()); + Assert.assertNotEquals(o.getOpenid(),n.getOpenid()); + } + @Data public static class Food { @Alias("bookId")