gpt4 book ai didi

java - 如何克隆一个对象并递归地将Id设置为Null?

转载 作者:行者123 更新时间:2023-11-30 05:35:15 24 4
gpt4 key购买 nike

这是我的用例:

我有 4 个类(class) A、B、C、D

  • 类 A 包含一个对象(类型 B)和一个对象列表(类型 C)
  • B 类包含一个对象(类型 D)

我想克隆 A 类,并递归地将 id 设置为 null。

这里是一个例子:

public class ClassA {

private Long id;
private String name;
private boolean ok;
private ClassB classB;
private List<ClassC> classCList;

}
<小时/>
public class ClassB {

private Long id;
private String name;
private ClassD classD;

}
<小时/>
public class ClassC{

private Long id;
private String name;

}
<小时/>
public class ClassD{

private Long id;
private String name;

}
<小时/>

我开发了两个函数来实现:
第一种方法:

public ClassA prepareClassA(ClassA detail) {

Optional.ofNullable(detail).ifPresent( detail -> {
detail.setId(null);
Optional.ofNullable(detail).map(ClassA::getClassB)
.ifPresent(objectB -> objectB.setId(null));

Optional.ofNullable(detail).map(ClassA::getClassB).map(ClassB::getClassD)
.ifPresent(objectB -> objectB.setId(null));

Optional.ofNullable(detail).map(ClassA::getClassCList).
.ifPresent(items -> items.stream().forEach(item -> {
item.setId(null);
}));

}
}

第二种方法:(包括 dozerMapper )

<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>

<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency>

我使用了 DozerBeanMapper 实现

public ClassA prepareClassA(ClassA detail) {

ClassA objectA = new ClassA();

DozerBeanMapper dozerBeanMapper = new DozerBeanMapper();

BeanMappingBuilder bean = beanMappingBuilder(ClassA.class);

dozerBeanMapper.addMapping(bean);
Optional.ofNullable(detail).ifPresent(detail -> dozerBeanMapper.map(detail, objectA));
return details;
}


public BeanMappingBuilder beanMappingBuilder(Class<?> source) {
return new BeanMappingBuilder() {
@Override
protected void configure() {
mapping(source, source,
TypeMappingOptions .wildcard(true)
//Here i have to do my work ?
//TypeMappingOptions.mapNull(true)
);
}
};
}

我想要这样的结果:

ClassA testA = new ClassA();
//fill all the objects in objectA with id != null

ClassA testA_convert = prepareClassA(testA);

// testA_convert.getId() must be null
// testA_convert.getClassB().getId() must be null
// testA_convert.getClassB().getClassD().getId() must be null
// testA_convert.getClassCList().forEach( element -> element.getId() must be null

问题:

  • 现有的库可以解决我的问题吗?
  • DozerMapper 可以做到这一点吗?
  • 最好的方法是什么?

最诚挚的问候

最佳答案

如果您已经克隆了对象并希望在没有 NPE 的情况下将 id 设置为 null,那么您可以为此创建一个帮助器接口(interface):

interface Nullify<T> {
void apply(T obj);

default <G> Nullify<T> andThen(Function<T, G> function, Nullify<G> nullify) {
return (T t) -> {
apply(t);
G g = function.apply(t);
if(g != null) {
nullify.apply(g);
}
};
}
}

以及用法

Nullify<ClassB> bNull = b -> b.setId(null);
bNull = bNull.andThen(ClassB::getClassD, d -> d.setId(null));

Nullify<ClassA> aNull = a -> a.setId(null);
aNull.andThen(ClassA::getClassB, bNull)
.andThen(ClassA::getClassCList, classCList -> classCList.forEach(c -> c.setId(null)))
.apply(classAObject);

尽管最好配置克隆/复制方法来忽略 ids(例如 MapStruct)

关于java - 如何克隆一个对象并递归地将Id设置为Null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56771187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com