如何在不使用循环的情况下复制集合?

时间:2018-10-24 15:46:03

标签: java collections deep-copy

我想知道是否有可用的方法来深度复制集合而不是使用Iterator来使它循环?由于我的方法采用了Collection<Something> something之类的参数,因此无法对其进行转换。谢谢。

2 个答案:

答案 0 :(得分:1)

出于简单的原因,Java中的内置方法不允许为集合创建深层副本:深层副本的定义取决于类。
没有实用的方法可以猜测它,并且依靠Cloneable(不是推荐的接口)不是一个好主意。
因此,您必须自己完成此任务。

您可以通过引入一个接口来定义通用方法,该接口定义了每个要深度复制实现的类的复制方法。
例如:

public interface Copyable<T> {

   T copy();
}

并实现它,例如:

public class Foo implements Copyable<Foo> {

   public Foo copy(){
      Foo foo = new Foo();
      // deep copy values in foo
      return foo;
   }
}

您可以在static中引入Copyable方法来执行深层收集副本:

public static <T extends Copyable<T>> List<T> deepCopyToList(Collection<T> collection) {
    return collection.stream()
                     .map(Copyable::copy)
                     .collect(Collectors.toList());
}

并以这种方式使用它:

List<Foo> foos = new ...;
List<Foo> fooCopies = Copyable.deepCopyToList(foos);

Foo实现Copyable的地方。

答案 1 :(得分:0)

您可以使用addAll创建原始集合的副本。