Java:如何整齐地深度克隆哈希集?
我有一个需要克隆的Java:如何整齐地深度克隆哈希集?,java,cloning,Java,Cloning,我有一个需要克隆的MyObject散列集。如果MyObject实现了复制构造函数,那么克隆设置MyObject 显然,我可以这样做: Set<MyObject> myNewObjects = new Set<MyObject>(); for(MyObject obj: myObjects) myNewObjects.add(new MyObject(obj)); Set myNewObjects=newset(); 对于(MyObject对象:myObjects)
MyObject
散列集。如果MyObject
实现了复制构造函数,那么克隆设置MyObject
显然,我可以这样做:
Set<MyObject> myNewObjects = new Set<MyObject>();
for(MyObject obj: myObjects) myNewObjects.add(new MyObject(obj));
Set myNewObjects=newset();
对于(MyObject对象:myObjects)myNewObjects.add(newmyobject(obj));
但我是作为Looong copy Constructor的一部分来做这件事的,我真的很想用一行代码来完成它,比如:
public myClass(MyClass toClone){
//...
this.myObjects = new Set<MyObjects>(toClone.getmyObjects());
//...
}
公共myClass(myClass目录){
//...
this.myObjects=新集合(toClone.getmyObjects());
//...
}
有什么建议吗 你可以用谷歌番石榴做这样的事情:
Set<MyObject> newSet = new HashSet<MyObject>(
Iterables.transform(myObjects,new Function<MyObject, MyObject>() {
@Override
public MyObject apply(MyObject input) {
return new MyObject(input);
}
}));
Set<MyObject> set1 = new HashSet<>();
Set<MyObject> set2 = set1.stream().map(MyObject::new).collect(Collectors.toSet());
Set newSet=newhashset(
变换(MyObject,新函数(){
@凌驾
公共MyObject应用(MyObject输入){
返回新的MyObject(输入);
}
}));
或者,如果您希望它不可变,请使用:
Set newSet=ImmutableSet.copyOf(
变换(MyObject,新函数(){
@凌驾
公共MyObject应用(MyObject输入){
返回新的MyObject(输入);
}
}));
不幸的是,除非您可以使用Java 8,否则它不会比您现有的更紧凑。如果您使用Java 8,您可以执行以下操作:
Set<MyObject> newSet = new HashSet<MyObject>(
Iterables.transform(myObjects,new Function<MyObject, MyObject>() {
@Override
public MyObject apply(MyObject input) {
return new MyObject(input);
}
}));
Set<MyObject> set1 = new HashSet<>();
Set<MyObject> set2 = set1.stream().map(MyObject::new).collect(Collectors.toSet());
Set set1=new HashSet();
Set set2=set1.stream().map(MyObject::new).collect(Collectors.toSet());
但是,请记住,使用:
对于返回的集合的类型、可变性、序列化性或线程安全性没有任何保证
尽管Java 8 Update 5中的当前实现使用常规HashSet。Set Set=new HashSet();
Set<MyObject> set = new HashSet<>();
for (MyObject value : myHash) {
set.add(value.copy());
}
for(MyObject值:myHash){
set.add(value.copy());
}
value.copy()
是克隆对象的函数(你需要创建一个这样的方法,创建一个新对象,并相应地分配字段,以便进行深度克隆。)。还有一个可以使用的可克隆界面。嗨,大卫,我遇到的每一篇文章都强烈警告我不要使用clone(),因为它的实现本身就被破坏了。。。您是否不同意,或者这只是供参考?您可以随时覆盖克隆,但是的,它在默认情况下有点崩溃。在Java中没有完全通用的方法来深度克隆任何内容。您必须直接使用MyObject的构造函数。@Paul要求一个深度副本。嗨,Giovanni,我觉得HashSet副本构造函数会给我一个浅副本?我的意思是,它不会调用集合中每个元素的副本构造函数吗?@Paul我不知道你实际上在创建新实例,抱歉。我会编辑。@Paul请看一下编辑,再次为误读道歉!谢谢你的帮助!:)Java 6遗留系统:(