Java:如何整齐地深度克隆HashSet?

时间:2014-06-26 17:54:33

标签: java cloning

我需要克隆一个MyObject的HashSet。如果MyObject实现了复制构造函数,那么克隆Set myObjects

的最简单,最简单的方法是什么?

显然我可以这样做:

 Set<MyObject> myNewObjects = new Set<MyObject>(); 
 for(MyObject obj: myObjects) myNewObjects.add(new MyObject(obj));

但是我这样做是作为loooong copy-construcotr的一部分而且我真的希望能够在一行中完成它,如:

public myClass(MyClass toClone){
    //... 
    this.myObjects = new Set<MyObjects>(toClone.getmyObjects()); 
    //... 
}

有什么建议吗?

3 个答案:

答案 0 :(得分:12)

如果您使用的是Java 8,则可以执行以下操作:

Set<MyObject> set1 = new HashSet<>();
Set<MyObject> set2 = set1.stream().map(MyObject::new).collect(Collectors.toSet());

但请注意,使用Collectors.toSet()

  

对返回的Set的类型,可变性,可序列化或线程安全性没有任何保证

尽管Java 8 Update 5中的当前实现使用常规HashSet。

答案 1 :(得分:4)

您可以使用Google Guava的Iterables执行以下操作:

Set<MyObject> newSet = new HashSet<MyObject>(
  Iterables.transform(myObjects,new Function<MyObject, MyObject>() {
    @Override
    public MyObject apply(MyObject input) {
      return new MyObject(input);
    }
  }));

或者如果你想让它永久使用Guava's immutable set

Set<MyObject> newSet = ImmutableSet.copyOf(
  Iterables.transform(myObjects,new Function<MyObject, MyObject>() {
    @Override
    public MyObject apply(MyObject input) {
      return new MyObject(input);
    }
  }));

不幸的是,除非你可以使用Java 8,否则它不会比你已经拥有的更紧凑。

答案 2 :(得分:0)

Set<MyObject> set = new HashSet<>();
        for (MyObject value : myHash) {
            set.add(value.copy());
        }

value.copy()是克隆对象的函数(您需要创建一个类似的方法并创建一个新对象并相应地分配字段以进行深度克隆工作。)。